该文章基于《Spring+MyBatis企业应用实战》进行总结,旨在积累巩固
SpringMVC的校验有两种选择的方式,一种是利用Spring框架自带的Validation校验框架进行校验、另一种是利用Java验证规范中的JSR 303实现校验功能。
Validation校验框架
SpringMVC实战(二)——常见配置最后一部分我通过@InitBinder注册了Validatior,现在展示一种新的注册Validatior的方法
@Repository("XXXValidator")
public class XXXValidator implements Validator{
@Override
public boolean supports(Class<?> clazz){
return XXX.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object targer,Errors errors){
ValidationUtils.rejectIfEmpty(errors,"属性名称",null,"为空错误");
if(校验条件){
errros.rejectValue("属性名",null,"错误信息");
}
}
}
光有实现了Validator接口的类还不够,还需要将该实现类通过依赖注入注入进Controller中,这一点和使用@InitBinder不同,下面是注入的方式:
@Controller
public class XXXController{
@Autowired
@Qulifier("XXXValidator")
private XXXValidator xxxvalidator;
}
Validator校验框架通过硬编码完成校验,会造成程序的耦合,因此更加推荐使用JSR303
JSR 303校验
JSR 303只是提出的一个标准,该标准建议使用Hibernate-Validator的实现,其中JSR 303标准提供了一下注解方法:
注解 | 功能 |
---|---|
@Null | 验证是否为null |
@NotNull | 无法检查长度为0的字符串 |
@AssertTrue | 验证Boolean对象是否为true |
@AssertFalse | 验证Boolean对象是否为false |
@Max(value) | 验证是否小于等于指定值 |
@Min(value) | 验证是否大于等于指定值 |
@DecimalMax(value) | 效果同@Max,只是类型必须为BigDecimal类型 |
@DecimalMin(value) | 效果同@Min,只是类型必须为BigDecimal类型 |
@Digits(integer,fraction) | 验证字符串是否符合指定格式的数字,integer为整数精度,fraction为小数精度 |
@Size(min,max) | 验证长度是否在给定范围(针对Collection及String) |
@Past | 验证Date是否在当前时间之前 |
@Future | 验证Date是否在当前事件之后 |
@Pattern(regexp) | 验证String对象是否符合正则表达式的规则 |
当然Hibernate-Validator实现也提供了额外的注释的扩展
注解 | 功能 |
---|---|
@NotBlank | 字符串是否为null,对于String会通过Trim并判断长度是否大于0 |
@URL | 验证是否为合法的URL |
验证是否为合法的邮件地址 | |
@NotEmpty | 检查元素是否为null或者empty,用于Collection和String |
@Range(min,max) | 验证属性值是否在合适的范围内,message用于存储错误信息 |
以上的所有注解都具有message属性用于保存错误信息
只在domain类的属性上进行注释是暂时不行的,还需要在Controller中通过在参数上同时使用@Valid、@ModelAttribute两个注解,才能完成JSR 303验证
@RequestMapping("/xxx")
public String test(@Valid @ModelAttribute Domain domain,Errors errors){
if(errors.hasErrors()){
...
}
}
JSR 303校验的国际化消息
当我们每次进行检验的时候,都会生成一个FieldError对象,它的类层次结构如下
可以看见他实现了MessageSourceResolvable接口,该接口用于对国际化资源进行解析。
当出现错误信息时,会产生下面的错误代码:
对应注释.对应domain.对应属性名,举个例子:URL.user1.blog。所以通过自定义的本地化文件就可以方便的输出国际化消息。关于SpringMVC的国际化,可以查看我之前的博客SpringMVC实战(四)——国际化