有两种方式可以验证输入,一种是利用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;