有两种方式可以验证输入,一种是利用Spring自带的验证框架,或者利用JSR303实现。
Converter和Formatter作用于字段级。在MVC应用程序中他们将String转换或格式化成另一种java类型。
在应用程序中Formatter,validator的事件顺序:在调用Controller期间,将会有一个或多个Formatter,试图将输入字符串转换成domain对象中的field值,一旦格式化成功,验证器就会介入。
如:LocalDate为类型的属性不能比今天早或者晚,当调用Controller时,Formatter会将字符串转化成LocalDate类型,并赋值给属性,如果转换失败用户会被转会到前一个表单,如果转换成功,validator会介入,查看是否比今天早或晚
创建Spring验证器,要实现org.springframework.validation.Validator接口
public interface Validator { boolean supports(Class<?> clazz); void validate(Object target, Errors errors); }
ValidationUtils类
org.springframework.validation.ValidationUtils类是一个工具,有助于编写Spring验证器。验证器不需要显示注册,但是如果想要从某个属性文件中获取错误消息,则需要通过声明messageSource bean,告诉Spring要去哪里查找这个文件。如:
if(fname == null || fname.isEmpty()) { errors.rejectValue("price"); } //上例代码可以写成下例代码 validationUtils.rejectIfEmpty("price"); /************************************/ if(fname == null || fname.trim().isEmpty()){ errors.rejectValue("price"); } //上例代码可以写成下例代码 ValidationUtils.rejectIfEmptyOrWhitespace("price");
JSR 303验证
通过注解给对象属性添加约束。
属性 | 描述 | 范例 |
@AssertFalse | 应用于boolean属性,该属性值必须为false | @AssertFalse boolean a; |
@AssertTrue | 应用于boolean属性,该属性值必须为true | @AssertTrue boolean a; |
@DecimalMax | 该属性值必须小于或等于指定值的小数 | @DecimalMax("1.1") BigDecimal price; |
@DecimalMin | 该属性值必须大于或等于指定值的小数 | @DecimalMax("0.001") BigDecimal price; |
@Digits | 该属性值必须在指定范围内。integer属性定义该数值的最大整数部分, fraction属性定义该数值的最大小数部分 | @Digits(integer=5,fraction=2) BigDecimal price; |
@Future | 该属性值必须是未来的一个如期 | @Future Date date; |
@Max | 该属性值必须是一个小于或等于指定值的整数 | @Max int a; |
@Min | 该属性值必须是一个大于或等于指定的值整数 | @Min int a; |
@NotNull | 该属性值不能为null | @NotNull String str; |
@Null | 该属性值必须为null | @Null String str; |
@Past | 该属性值必须是过去的一个日期 | @Past Date birth; |
@Pattern | 该属性值必须与指定的常规表达式想匹配 | ??? |
@Size | 该属性值必须在指定范围内 | @Si***=2, max=100) String str; |