springboot-表单验证Valid|AOP|统一异常处理

1️⃣ Validator

1.1 使用场景

提供接口与用户交互(获取数据、上传数据等),由于这个过程需要用户进行相关的操作,为了避免出现一些错误的数据等,一般需要对数据进行校验,随着接口的增多,校验逻辑的冗余度也越来越大,虽然可以通过抽象出校验的方法来处理,但还是需要每次手动调用校验逻辑

1.1.1 验证模式

  • 普通模式(默认)
     会校验完所有的属性,然后返回所有的验证失败信息
  • 快速失败返回模式
     只要有一个验证失败,则返回此条验证失败信息

1.1.2 Validator 配置

默认工厂
Validation.buildDefaultValidatorFactory().getValidator()
在这里插入图片描述

@Configuration
public class ValidatorConfiguration {
   
    @Bean
    public Validator validator(){
   
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                // true-快速失败返回模式    false-普通模式
                .addProperty( "hibernate.validator.fail_fast", "true" )
                .buildValidatorFactory();

        return validatorFactory.getValidator();
    }
}

1.1.3 分组配置

分组配置介绍

  1. 在实体字段上分组 groups=InterfaceA.class

1.1.4 国际化

learn more

1.1.5 声明和验证Bean

  • 字段级别约束 : bean-validator直接访问变量不需要getter

  • 属性级别约束 : 标准的java bean(拥有setget), 注解可以放在get方法上,不是set

  • 类别级约束 : 自定义约束

  • 约束是可以继承的

  • 可以使用@Valid校验对象图 (成员变量是对象)

  • 创建自定义约束注解

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

spring-boot-starter-web包中已经包含了Hibernate-Validator 依赖

<dependency>
	<groupId>org.hibernate.validator</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>6.0.17.Final</version>
	<scope>compile</scope>
</dependency>

使用方法 1 (缺点:每个方法需要+BindingResult参数)

@Valid注解用于校验,所属包为:javax.validation.Valid。
使用过程:
验证传进controller的对象属性是否有错
①.Girl实体类成员变量需要添加充当校验条件的注解,如:@Min

@Min(value = 18 , message = "未满18岁不可访问")
private Integer age;

②.其次在controller层的方法的要校验的参数上添加@Valid注解

@PostMapping(value = "/girls")
//!!!!需要加@Valid注解
// SpringBoot会自动将异常错误信息绑定到该参数上BindingResult 
   public Object addGirl(@Valid Girl girl,BindingResult br) {
   
   	Result result = new Result("addGirl_Error", 0, false);
   	
   	if (br.hasErrors()){
    //需要处理没验证通过的结果,错误信息返回
   		result.setMessage(br.getFieldError().getDefaultMessage());
   		return result;
   	}
       try {
   
           result.setResult(commandService.addGirl(girl));
           result.setType("addGirl_ACK");
           return result;
       } catch (Exception e) {
   
           logger.error("添加女生失败", e);
           result.setCode(-3);
           return result;
       }
   }

@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。@Valid不提供分组功能

使用方法 2

不添加BindingResult br ,抛出异常交给全局异常类处理

使用方法 3

实体

@NotNull(message = "id不能为空")
private Integer id;

@Range(min=0,max=3,message="type需要在0-3之间")
private Integer type;

import lombok.Data;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 校验工具类
 * <p>
 * ValidationResult result = ValidationUtils.validateEntity(obj); // 校验实体
 * ValidationResult result = ValidationUtils.validateProperty(obj,"name")//校验属性;
 * result.isHasErrors();//是否有错误
 * result.getErrorMessage();//取得错误信息
 *
 * @author zhaojy
 */
public class ValidationUtils {
   
    /**
     * 默认校验工厂 生产的 validator
     * 也可以通过博客中 配置类注入
     */
    private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

    /**
     * 对 整个 对象进行校验
     *
     * @param <T>object 对象
     * @return ValidationResult 校验结果
     */
    public static <T> ValidationResult validateEntity(T object) {
   
        ValidationResult result = new 
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以使用AOP(面向切面编程)来实现统一异常处理。下面是一个简单的示例: 首先,在你的Spring Boot项目中创建一个全局异常处理类,例如 `GlobalExceptionHandler`。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { // 处理异常逻辑 // 返回自定义的异常信息 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("发生异常,请联系管理员"); } } ``` 在上面的代码中,我们使用了 `@ControllerAdvice` 注解来标识全局异常处理类,并使用 `@ExceptionHandler` 注解来指定处理的异常类型。 接下来,我们需要在Spring Boot应用程序的入口类上添加 `@EnableAspectJAutoProxy` 注解以启用AOP功能。 ```java @SpringBootApplication @EnableAspectJAutoProxy public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 然后,创建一个切面类来捕获所有被 `@Controller` 或 `@RestController` 注解标识的类中抛出的异常,并将其委托给全局异常处理类进行处理。 ```java @Aspect @Component public class ExceptionAspect { @Autowired private GlobalExceptionHandler globalExceptionHandler; @Pointcut("@within(org.springframework.stereotype.Controller) || @within(org.springframework.web.bind.annotation.RestController)") public void controllerPointcut() {} @AfterThrowing(pointcut = "controllerPointcut()", throwing = "ex") public Object handleException(JoinPoint joinPoint, Exception ex) throws Throwable { return globalExceptionHandler.handleException(ex); } } ``` 在上面的代码中,我们使用 `@Aspect` 注解标识该类为切面类,并使用 `@Component` 注解将其作为Spring组件进行管理。 通过 `@Pointcut` 注解指定切入点,我们选择了所有被 `@Controller` 或 `@RestController` 注解标识的类。 在 `@AfterThrowing` 注解中,我们指定了切入点为 `controllerPointcut()`,并指定了异常类型为 `Exception`,在方法中调用全局异常处理类的方法进行异常处理。 这样,当被 `@Controller` 或 `@RestController` 注解标识的类中抛出异常时,切面类会捕获到异常并委托给全局异常处理类进行处理。 这就是使用AOP实现Spring Boot统一异常处理的基本步骤。你可以根据自己的需求进行扩展和定制化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值