SpringMVC实战(七)——数据校验 深碍√TFBOYSˉ_ 2022-05-29 10:16 172阅读 0赞 **该文章基于《Spring+MyBatis企业应用实战》进行总结,旨在积累巩固** SpringMVC的校验有两种选择的方式,一种是利用Spring框架自带的Validation校验框架进行校验、另一种是利用Java验证规范中的JSR 303实现校验功能。 # Validation校验框架 # [SpringMVC实战(二)——常见配置][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标准提供了一下注解方法: <table> <thead> <tr> <th>注解</th> <th>功能</th> </tr> </thead> <tbody> <tr> <td>@Null</td> <td>验证是否为null</td> </tr> <tr> <td>@NotNull</td> <td>无法检查长度为0的字符串</td> </tr> <tr> <td>@AssertTrue</td> <td>验证Boolean对象是否为true</td> </tr> <tr> <td>@AssertFalse</td> <td>验证Boolean对象是否为false</td> </tr> <tr> <td>@Max(value)</td> <td>验证是否小于<strong>等于</strong>指定值</td> </tr> <tr> <td>@Min(value)</td> <td>验证是否大于<strong>等于</strong>指定值</td> </tr> <tr> <td>@DecimalMax(value)</td> <td>效果同@Max,只是类型必须为BigDecimal类型</td> </tr> <tr> <td>@DecimalMin(value)</td> <td>效果同@Min,只是类型必须为BigDecimal类型</td> </tr> <tr> <td>@Digits(integer,fraction)</td> <td>验证字符串是否符合指定格式的数字,integer为整数精度,fraction为小数精度</td> </tr> <tr> <td>@Size(min,max)</td> <td>验证长度是否在给定范围(针对Collection及String)</td> </tr> <tr> <td>@Past</td> <td>验证Date是否在当前时间之前</td> </tr> <tr> <td>@Future</td> <td>验证Date是否在当前事件之后</td> </tr> <tr> <td>@Pattern(regexp)</td> <td>验证String对象是否符合正则表达式的规则</td> </tr> </tbody> </table> 当然Hibernate-Validator实现也提供了额外的注释的扩展 <table> <thead> <tr> <th>注解</th> <th>功能</th> </tr> </thead> <tbody> <tr> <td>@NotBlank</td> <td>字符串是否为null,对于String会通过Trim并判断长度是否大于0</td> </tr> <tr> <td>@URL</td> <td>验证是否为合法的URL</td> </tr> <tr> <td>@Email</td> <td>验证是否为合法的邮件地址</td> </tr> <tr> <td>@NotEmpty</td> <td>检查元素是否为null或者empty,用于Collection和String</td> </tr> <tr> <td>@Range(min,max)</td> <td>验证属性值是否在合适的范围内,message用于存储错误信息</td> </tr> </tbody> </table> **以上的所有注解都具有message属性用于保存错误信息** 只在domain类的属性上进行注释是暂时不行的,还需要在Controller中通过在参数上同时使用@Valid、@ModelAttribute两个注解,才能完成JSR 303验证 @RequestMapping("/xxx") public String test(@Valid @ModelAttribute Domain domain,Errors errors){ if(errors.hasErrors()){ ... } } ### *JSR 303校验的国际化消息* ### 当我们每次进行检验的时候,都会生成一个FieldError对象,它的类层次结构如下 ![Image 1][] 可以看见他实现了MessageSourceResolvable接口,该接口用于对国际化资源进行解析。 当出现错误信息时,会产生下面的错误代码: **对应注释.对应domain.对应属性名**,举个例子:URL.user1.blog。所以通过自定义的本地化文件就可以方便的输出国际化消息。关于SpringMVC的国际化,可以查看我之前的博客[SpringMVC实战(四)——国际化][SpringMVC 1] [SpringMVC]: http://blog.csdn.net/weixin_40134367/article/details/79595067 [Image 1]: [SpringMVC 1]: http://blog.csdn.net/weixin_40134367/article/details/79636037
还没有评论,来说两句吧...