Java 注解方式校验请求参数
1. 参数校验常用注解
注解 | 验证的数据类型 | 备注 |
Null | 任意类型 | 参数值必须是 Null |
NotNull | 任意类型 | 参数值必须不是 Null |
NotBlank | 只能作用于字符串 |
字符串不能为 null,而且字符串长度必须大于 0,至少包含一个非空字符串 |
NotEmpty |
CharSequence Collection Map Array |
字符串:字符串长度必须大于 0,空字符串(“ ”)可以通过校验; Collection:集合大小必须大于 0; Map:map 的大小必须大于 0; Array:数组长度必须大于 0; |
Size |
CharSequence Collection Map Array |
同 NotEmpty |
Range |
数字类型 字符串类型 |
数值或者字符串的值必须在 min 和 max 指定的范围内 |
Length | 字符串类型 | 字符串的长度在 min 和 max 之间 |
Pattern | 字符串类型 | 验证字符串是否符合正则表达式 |
Min | 整型类型 | 参数值必须大于等于 最小值 |
Max | 整型类型 | 参数值必须小于等于 最大值 |
DecimalMin | 整型类型 | 参数值必须大于等于 最小值 |
DecimalMax | 整型类型 | 参数值必须小于等于 最大值 |
AssertTrue | 布尔类型 | 参数值必须为 true |
AssertFalse | 布尔类型 | 参数值必须为 false |
Past | 时间类型 | 参数值必须小于 当前时间 |
Future | 时间类型 | 参数值必须大于 当前时间 |
2. @Validated 和 @Valid
2.1 相同点
在检验参数符合规范的功能上基本一致;
2.2 不同点
2.2.1 提供者
validated 是 Spring Validation 验证框架对参数的验证机制;
valid 是 javax 提供的参数验证机制
2.2.2 作用域
validated :类,方法,参数
valid:方法, 字段, 构造方法, 参数, TYPE_USE;
TYPE_USE:
在 Java 8 之前的版本中,只能允许在声明式前使用 Annotation。而在 Java 8 版本中,Annotation 可以被用在任何使用 Type 的地方,例如:初始化对象时 (new),对象类型转化时,使用 implements 表达式时,或者使用 throws 表达式时。
//初始化对象时 String myString = new @Valid String();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对象类型转化时</span> myString =<span style="color: rgba(0, 0, 0, 1)"> (@Valid String) str; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用 implements 表达式时</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MyList<T> <span style="color: rgba(0, 0, 255, 1)">implements</span> List<@Valid T><span style="color: rgba(0, 0, 0, 1)"> { ... } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用 throws 表达式时</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> validateValues() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> @Valid ValidationFailedException{ ... }</span></pre>
3. 嵌套检验
在被检验的字段上添加 @Valid 注解就可以实现嵌套检验
当对象 Man 的字段 houses 包含 House 对象类型时,在检验 houses 字段时可以检验 House 对象的属性字段时,就称为嵌套检验。
示例如下:
在检验 Man 对象的 houses 字段时,在 houses 字段上添加 @Valid 注解后,就可以检验 list 中的 House 的属性是否符合要求;
否则只会检验 houses 的集合大小是否大于 1,不会校验集合中的 House 对象,比如 House 对象的 name 长度是否符合要求。
class Man{@Valid @Size(min </span>= 1<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">private</span> List<House><span style="color: rgba(0, 0, 0, 1)"> houses;
}
class House{
@Length(min </span>= 1,max = 10<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String name;
}