• 定义的校验类型
  • @Null :验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串
  • @NotBlank:检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
  • @NotEmpty:检查约束元素是否为NULL或者是EMPTY.
  • @CreditCardNumber:信用卡验证
  • @Email:验证是否是邮件地址,如果为null,不进行验证,算通过验证。
  • @URL(protocol=,host=, port=,regexp=,flags=) ip地址校验
  • Booelan检查
  • @AssertTrue 验证 Boolean 对象是否为 true
  • @AssertFalse 验证 Boolean 对象是否为 false
  • 长度检查
  • @Size(min=, max=) :验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
  • @Length(min=, max=) :Validates that the annotated string is between min and max included.
  • 日期检查
  • @Past:验证 Date 和 Calendar 对象是否在当前时间之前
  • @Future :验证 Date 和Calendar 对象是否在当前时间之后
  • @Pattern:验证 String 对象是否符合正则表达式的规则
  • 数值检查
  • @Min :验证 Number 和 String 对象是否大等于指定的值
  • @Max:验证 Number 和 String 对象是否小等于指定的值
  • @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
  • @DecimalMin:被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
  • @Digits:验证 Number 和 String 的构成是否合法
  • @Digits(integer=,fraction=) :验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
  • @Range(min=, max=) :Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.

@Valid

@Valid注解用于校验,所属包为:javax.validation.Valid

首先需要在实体类的相应字段上添加用于充当校验条件的注解

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    @NotEmpty(message = "不能为空")
    private String name;

    @NotNull(message = "不能为空")
    @Min(value = 18, message = "不能小于18")
    private Integer age;

}

其次在controller层的方法的要校验的参数上添加@Valid 或 @Validated注解,并且需要传入BindingResult对象,用于获取校验失败情况下的反馈信息,如下代码:

@RestController
public class Ping2Controller {
    @PostMapping("/addUser")
	//这里也可使用@Validated
    public String addUser(@RequestBody @Valid User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            StringBuffer stringBuffer = new StringBuffer();
            for (ObjectError error : bindingResult.getAllErrors()) {
                stringBuffer.append(error.getDefaultMessage()).append(";");
            }
            return stringBuffer.toString();
        } else {
            return user.toString();
        }
    }
}

@Validated

@Validated注解用于校验,所属包为:org.springframework.validation.annotation;
@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。@Valid不提供分组功能。

@Validated的特殊用法:

1、分组:

当一个实体类需要多种验证方式时。例:对于一个实体类的id来说,新增的时候是不需要的,对于更新时是必须的。
这里可以定义两个组:

public interface Insert {  
}  

public interface Update {  
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    @NotEmpty(groups = Update.class, message = "ID不能为空")
    private Integer id;

    @NotEmpty(groups = Insert.class, message = "姓名不能为空")
    private String name;

    @NotNull(groups = Insert.class, message = "年龄不能为空")
    @Min(value = 18, message = "年龄不能小于18")
    private Integer age;

}
@RestController
public class Ping2Controller {

    @PostMapping("/addUser")
    public String addUser(@RequestBody @Validated(value = {Insert.class}) User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            StringBuffer stringBuffer = new StringBuffer();
            for (ObjectError error : bindingResult.getAllErrors()) {
                stringBuffer.append(error.getDefaultMessage()).append(";");
            }
            return stringBuffer.toString();
        } else {
            return user.toString();
        }
    }
    
    @PostMapping("/updateUser")
    public String updateUser(@RequestBody @Validated(value = {Update.class}) User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            StringBuffer stringBuffer = new StringBuffer();
            for (ObjectError error : bindingResult.getAllErrors()) {
                stringBuffer.append(error.getDefaultMessage()).append(";");
            }
            return stringBuffer.toString();
        } else {
            return user.toString();
        }
    }
}

不分配groups,默认每次都要进行验证

2、组序列

默认情况下,不同组别的约束验证是无序的,然而在某些情况下,约束验证的顺序却很重要。

例:
1.第二个组中的约束验证依赖于一个稳定状态来运行,而这个稳定状态是由第一个组来进行验证的。
2.某个组的验证比较耗时,CPU 和内存的使用率相对比较大,最优的选择是将其放在最后进行验证。因此,在进行组验证的时候尚需提供一种有序的验证方式,这就提出了组序列的概念。
一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证。
分组接口类 (通过@GroupSequence注解对组进行排序):

public interface First {  
}  
public interface Second {  
}  
@GroupSequence({First.class,Second.class})  
public interface Group {  
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    
    @NotEmpty(groups={First.class})
    private String id;

    @NotEmpty(groups={First.class})
    @Size(min=3,max=8,groups={Second.class})
    private String name;
}
@PostMapping("/uu")
    public String uu(@RequestBody @Validated(value = {Group.class}) User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            StringBuffer stringBuffer = new StringBuffer();
            for (ObjectError error : bindingResult.getAllErrors()) {
                stringBuffer.append(error.getDefaultMessage()).append(";");
            }
            return stringBuffer.toString();
        } else {
            return user.toString();
        }
    }
3、验证多个对象

一个功能方法上处理多个模型对象时,需添加多个验证结果对象

@RequestMapping("/addPeople")  
    public @ResponseBody String addPeople(@Validated People p,BindingResult result,@Validated Person p2,BindingResult result2)  
    {  
        if(result.hasErrors()||result2.hasErrors())  {  
            return "false";  
        }else{
		  return "true";  
		} 
    }