在Spring Boot中,@Validated注解用于验证请求参数。它可以应用在Controller类或方法上
org.springframework.boot spring-boot-starter-validation
注解 | 验证的数据类型 | 描述 |
---|---|---|
@NotNull | 任意类型 | 验证属性不能为null |
@NotBlank | 字符串 | 验证字符串属性不能为空且长度必须大于0 |
@Size(min,max ) | CharSequence Collection Map Array | 字符串:字符串长度必须在指定的范围内 Collection:集合大小必须在指定的范围内 Map:map的大小必须在指定的范围内 Array:数组长度必须在指定的范围内 |
@Min | 整型类型 | 验证数字属性的最小值 |
@Max | 整型类型 | 验证数字属性的最大值 |
@DecimalMin | 数字类型 | 验证数字属性的最小值(包括小数) |
@DecimalMax | 数字类型 | 验证数字属性的最大值(包括小数) |
@Digits(integer,fraction) | 数字类型 | 验证数字属性的整数位数和小数位数 |
字符串类型 | 验证字符串属性是否符合Email格式 | |
@Pattern | 字符串 | 验证字符串属性是否符合指定的正则表达式 |
@Positive | 数字类型 | 验证数值为正数 |
@PositiveOrZero | 数字类型 | 验证数值为正数或0 |
@Negative | 数字类型 | 验证数值为负数 |
@NegativeOrZero | 数字类型 | 验证数值为负数或0 |
@AssertTrue | 布尔类型 | 参数值必须为 true |
@AssertFalse | 布尔类型 | 参数值必须为 false |
@Past | 时间类型(Date) | 参数值为时间,且必须小于 当前时间 |
@PastOrPresent | 时间类型(Date) | 参数值为时间,且必须小于或等于 当前时间 |
@Future | 时间类型(Date) | 参数值为时间,且必须大于 当前时间 |
@FutureOrPresent | 时间类型(Date) | 参数值为时间,且必须大于或等于 当前日期 |
@Data public class User { // @NotNull:验证属性不能为null。 @NotNull(message = "用户名不能为null") private String username; // @NotBlank:验证字符串属性不能为空且长度必须大于0。 @NotBlank(message = "用户名不能为空且长度必须大于0") private String username1; // @Size:验证字符串属性的长度范围。 @Size(min = 6, max = 20,message = "密码最小6位,最长20位") private String password; // @Min:验证数字属性的最小值。 @Min(value = 18,message = "年龄最小18岁") private int age; // @Max:验证数字属性的最大值。 @Max(100) private int age1; // @DecimalMin:验证数字属性的最小值(包括小数)。 @DecimalMin("0.01") private BigDecimal price; // @DecimalMax:验证数字属性的最大值(包括小数)。 @DecimalMax("1000.00") private BigDecimal price1; // @Digits:验证数字属性的整数位数和小数位数。 @Digits(integer = 3, fraction = 2) private BigDecimal weight; // @Email:验证字符串属性是否符合Email格式。 @Email private String email; // @Pattern:验证字符串属性是否符合指定的正则表达式。 @Pattern(regexp = "[A-Za-z0-9]+") private String username2; // @Positive:验证数值为正数 @Positive private int age2; // @PositiveOrZero:验证数值为正数或0 @PositiveOrZero private int age3; // @Negative:验证数值为负数 @Negative private int age4; // @NegativeOrZero:验证数值为负数或0 @NegativeOrZero private int age5; // @AssertTrue:参数值必须为 true @AssertTrue private boolean hasMoney; // @AssertFalse:参数值必须为 false @AssertFalse private boolean hasMoney1; // @Past:参数值为时间,且必须小于 当前时间 @Past private Date time; // @PastOrPresent:参数值为时间,且必须小于或等于 当前时间 @PastOrPresent private Date time1; // @Future:参数值为时间,且必须大于 当前时间 @Future private Date time2; // @FutureOrPresent:参数值为时间,且必须大于或等于 当前日期 @FutureOrPresent private Date time3; }
嵌套校验:
在被检验的字段上添加 @Valid 注解就可以实现嵌套检验
@Data public class User3 { @Valid Listuser2List; @Valid private User2 user2; } @Data class User2 { @NotBlank(message = "用户名不能为空!") private String username; }
示例:
public class User { @NotBlank(message = "用户名不能为空") private String username; // getter and setter }
示例:
public interface Group1 {} public interface Group2 {} public class User { @NotBlank(groups = Group1.class) private String username; @NotBlank(groups = Group2.class) private String password; // getter and setter }
username属性只在Group1分组中进行验证,password属性只在Group2分组中进行验证。
示例:
public class User { @NotBlank(payload = {ValidationInfo.class}) private String username; // getter and setter } public class ValidationInfo { private String info; // getter and setter }
当验证失败时,可以通过ConstraintViolation对象获取到ValidationInfo对象,并获取其中的验证信息。
Set> violations = validator.validate(user); for (ConstraintViolation violation : violations) { if (violation.getConstraintDescriptor().getPayload().contains(ValidationInfo.class)) { ValidationInfo validationInfo = violation.getConstraintDescriptor().getPayload(ValidationInfo.class); String info = validationInfo.getInfo(); // 处理验证信息 } }
在post上使用@Validated,get上直接放校验注解