当需要处理一个应用程序的业务逻辑时,数据校验是必须要进行的,应用程序必须通过某种手段来确保输入的数据在语义上是正确的。通常应用程序是分层的,同样的数据验证逻辑可能会出现在不同的层中,此时就会导致代码冗余等问题。为避免此问题,最好将验证逻辑与相应的域模型进行绑定。
Bean Validation为Javabean验证定义了相应的元数据模型和API。默认的元数据是Java Annotations,通过使用XML可以对原有的元数据信息进行覆盖和扩展。在程序中可以通过Bean Validation或自定义的constraint(如@NotNull、@Max、@ZipCode),就可以确保数据模型的正确性。constraint可以附加到字段、getter方法、类或接口上。对于一些特定的需求,可以很容易的开发定制化的constraint。
Bean Validation是一个运行时的数据验证框架,验证后的错误会立马返回。
1、Bean验证
spring框架支持Bean Validation1.0和Bean Validation1.1,也支持spring Validator接口。spring应用程序可以选择全局启用bean验证,并专门用于所有验证需求。还可以为每个DataBinder实例注册额外的spring Validator实例,对于插入验证逻辑而不使用注解的情况可能会有用。
Bean Validation的内置约束:
@AssertFalse
用于约束字段或属性值必须是false。
@AssertFalse
boolean isSupport;
@AssertTrue
用于约束字段或属性值必须是true。
@AssertTrue
boolean isSupport;
@DecimalMax
用于约束字段或属性值必须是一个decimal类型的值,且值的大小必须小于或等于注解中的元素值。
@DecimalMax("10.00")
BigDecimal price;
@Digits
用于约束字段或属性值必须是指定范围内的数字。整数元素指定数字的最大整数,而小数元素指定数字的最大小数位数。
@Digits(integer=5,fraction=2)
BigDecimal price;
@Future
用于约束字段或属性值必须是将来的日期。
@Future
Date endTime;
@Max
用于约束字段或属性值必须是一个integer类型的值,且值的大小必须小于或等于注解中的元素值。
@Max(10)
int count;
@Min
用于约束字段或属性值必须是一个integer类型的值,且值的大小必须大于或等于注解中的元素值。
@Min
int count;
@NotNull
用于约束字段或属性值不能为空。
@NotNull
String name;
@Null
用于约束字段或属性值必须为空。
@Null
String desc;
@Past
用于约束字段或属性值必须是以前的日期。
@Past
Date birthday;
@Pattern
用于约束字段或属性值必须是匹配正则表达式的定义。
@Pattern(regexp="\\(\\d{2}\\)\\d{3}-\\d{5}")
String number;
@Size
对字段或属性的大小进行评估,且必须与指定的边界匹配。如果字段或属性是String,则会评估字符串的大小,如果集合则会对集合的大小进行评估,如果是map则会对map的大小进行评估,如果是数组则会对数组的大小进行评估。
@Size(min=2,max=100)
String msg;
2、Validator接口
spring提供了一个可以用来验证对象的Validator接口,它使用了Errors对象,验证器在验证时可以将验证失败报告发给Errors对象。
![](https://img.haomeiwen.com/i17879487/6a3f7421d963d161.png)
通过实现org.springframework.validation.Validator接口的方法来为User类提供验证行为。
![](https://img.haomeiwen.com/i17879487/b1bbfde900bd3d7c.png)
supports(Class<?> var1):验证是否支持所提供的类的实例。
validate(Object var1, Errors var2):验证给定的对象,并在验证出错误的时,将错误信息注册到给定的错误对象。
![](https://img.haomeiwen.com/i17879487/25c1c66b798bb596.png)
ValidationUtils类的静态rejectIfEmpty()方法用于验证name属性,如果属性值为null或空字符串,则验证不通过或拒绝。
--参考文献《Srping5开发大全》
网友评论