@Valid详解

  • hibernate validator(官方文档)提供了一套比较完善、便捷的验证实现方式。
  • spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖。

 泣血提示:springboot-web包也不能全信啊,我是用的2.3.0版本自带的hibernate-validator版本为6.0.14.final注解不生效,手动引入6.1.5.final可行正常验证

泣血提示:spring-boot升级为2.3版本后hibernate-validator又去掉了。。。。

需要自己引入依赖


   org.springframework.boot
   spring-boot-starter-validation
   ${spring-boot.version}

 

@Valid
用于验证注解是否符合要求,直接加在变量user之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。

@Valid不支持平面的参数校验(直接用@PathVariable或@RequestParam接受的参数),所以对GET请求的参数还是按照正常的方式来校验,而POST则将DTO对象为参数,用@Valid方式校验。校验通过进入业务逻辑层,否则抛出异常,由全局异常处理器来处理。

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping
    public User create (@Valid @RequestBody User user) {
        System.out.println(user.getId());
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        user.setId("1");
        return user;
    }
}  


然后在 User 类中添加验证信息的要求:

public class User {
    private String id;  
 
    @NotBlank(message = "密码不能为空")
    private String password;
}


@NotBlank 注解所指的 password 字段,表示验证密码不能为空,如果为空的话,上面 Controller 中的 create 方法会将message 中的"密码不能为空"返回。

当然也可以添加其他验证信息的要求:

限制    说明


@Null    限制只能为null
@NotNull    限制必须不为null
@AssertFalse    限制必须为false
@AssertTrue    限制必须为true
@DecimalMax(value)    限制必须为一个不大于指定值的数字
@DecimalMin(value)    限制必须为一个不小于指定值的数字
@Digits(integer,fraction)    限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future    限制必须是一个将来的日期
@Max(value)    限制必须为一个不大于指定值的数字
@Min(value)    限制必须为一个不小于指定值的数字
@Past    限制必须是一个过去的日期
@Pattern(value)    限制必须符合指定的正则表达式
@Size(max,min)    限制字符长度必须在min到max之间
@Past    验证注解的元素值(日期类型)比当前时间早
@NotEmpty    验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank    验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email    验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式


除此之外还可以自定义验证信息的要求,例如下面的 @MyConstraint:

public class User {
 
    private String id;
 
    @MyConstraint(message = "这是一个测试")
    private String username;
 
}


注解的具体内容:

@Constraint(validatedBy = {MyConstraintValidator.class})
@Target({ELementtype.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyConstraint {
    String message();
    Class[] groups() default {};
    Class[] payload() default {}; 
}


下面是校验器:

public class MyConstraintValidator implements ConstraintValidator {
    @Autowired
    private UserService userService;
    
    @Override
    public void initialie(@MyConstraint constarintAnnotation) {
        System.out.println("my validator init");
    }
    
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        userService.getUserByUsername("seina");
        System.out.println("valid");
        return false;
    }
}

该注解的使用:

一般需要配合

@ExceptionHandler和
@RestControllerAdvice来统一处理异常情况。

在spring 3.2中,新增了@ControllerAdvice,@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考帮助文档。@RestControllerAdvice 是组件注解,他使得其实现类能够被classpath扫描自动发现,如果应用是通过MVC命令空间或MVC Java编程方式配置,那么该特性默认是自动开启的主要配合@ExceptionHandler使用,统一处理异常情况,返回自定义信息的。

应用示例:

自定义异常返回 

@Valid详解_第1张图片 RestController中添加valid验证:

实体中定义严正要求:notblank/notempty适用于字符串类型,数字类型要用notnull,否则报错。

@Valid详解_第2张图片

结果返回:

@Valid详解_第3张图片

对象A嵌套对象B,在A对象需要校验注解加入 @Valid ,如下:

@Valid详解_第4张图片

你可能感兴趣的:(学习,valid,spring,boot,注解,验证)