- 定义的校验类型
- @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";
}
}