SpringMVC验证框架Validation用法

1. 分组

有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需要的,对于更新时是必须的,可以如下配置:

 [java] view plain copy

  1. public class UserModel {  

  2.   

  3.     @NotNull(message = "{id.empty}", groups = { First.class })  

  4.     private int id;  

  5.   

  6.     @NotNull(message = "{username.empty}", groups = { First.class, Second.class })  

  7.     private String username;  

  8.   

  9.     @NotNull(message = "{content.empty}", groups = { First.class, Second.class })  

  10.     private String content;  

  11.   

  12.     public int getId() {  

  13.         return id;  

  14.     }  

  15.   

  16.     public void setId(int id) {  

  17.         this.id = id;  

  18.     }  

  19.   

  20.     public String getUsername() {  

  21.         return username;  

  22.     }  

  23.   

  24.     public void setUsername(String username) {  

  25.         this.username = username;  

  26.     }  

  27.   

  28.     public String getContent() {  

  29.         return content;  

  30.     }  

  31.   

  32.     public void setContent(String content) {  

  33.         this.content = content;  

  34.     }  

  35. }  

  36. public interface First {  

  37. }  

  38.   

  39. public interface Second {  

  40. }  

通过 groups 对验证进行分组

在controler中的代码如下:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

  1. @RequestMapping(value = "/save.action", method = RequestMethod.POST)  

  2. public String save(@Validated( { Second.class }) UserModel userModel, BindingResult result) {  

  3.     if (result.hasErrors()) {  

  4.         return "validate/error";  

  5.     }  

  6.     return "redirect:/success";  

  7. }  

  8.   

  9. @RequestMapping(value = "/update.action", method = RequestMethod.POST)  

  10. public String update(@Validated( { First.class, Second.class }) UserModel user, BindingResult result) {  

  11.     if (result.hasErrors()) {  

  12.         return "validate/error";  

  13.     }  

  14.     return "redirect:/success";  

  15. }  

2. 组序列

默认情况下,不同组别的约束验证是无序的,然而在某些情况下,约束验证的顺序却很重要,如下面两个例子:(1)第二个组中的约束验证依赖于一个稳定状态来运行,而这个稳定状态是由第一个组来进行验证的。(2)某个组的验证比较耗时,CPU 和内存的使用率相对比较大,最优的选择是将其放在最后进行验证。因此,在进行组验证的时候尚需提供一种有序的验证方式,这就提出了组序列的概念。

一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证。

下例中声明了组 GroupA.class,GroupB.class 和 Group.class,其中 default,GroupA,GroupB 均为 Group 的序列。

[java] view plain copy 在CODE上查看代码片派生到我的代码片

  1. public interface GroupA {  

  2. }  

  3.   

  4. public interface GroupB {  

  5. }  

  6.   

  7. @GroupSequence( { Default.class, GroupA.class, GroupB.class })  

  8. public interface Group {  

  9. }  

  10.   

  11. public class User {  

  12.     @NotEmpty(message = "firstname may be empty")  

  13.     private String firstname;  

  14.   

  15.     @NotEmpty(message = "middlename may be empty", groups = Default.class)  

  16.     private String middlename;  

  17.   

  18.     @NotEmpty(message = "lastname may be empty", groups = GroupA.class)  

  19.     private String lastname;  

  20.   

  21.     @NotEmpty(message = "country may be empty", groups = GroupB.class)  

  22.     private String country;  

  23. }  

[java] view plain copy 在CODE上查看代码片派生到我的代码片

  1. @RequestMapping(value = "/update.action", method = RequestMethod.POST)  

  2. public String register(@Validated(Group.class) User user, BindingResult result) {  

  3.     if (result.hasErrors()) {  

  4.         return "validate/error";  

  5.     }  

  6.     return "redirect:/success";  

  7. }  

3. 验证多个对象

当我们在一个功能处理方法上需要验证多个模型对象时,需要通过如下形式来获取验证结果:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

  1. @RequestMapping("/validate/multi")  

  2. public String multi(@Valid @ModelAttribute("a") A a, BindingResult aErrors, @Valid @ModelAttribute("b") B b, BindingResult bErrors) {  

  3.   

  4.     if (aErrors.hasErrors()) { //如果a模型对象验证失败  

  5.         return "validate/error";  

  6.     }  

  7.     if (bErrors.hasErrors()) { //如果a模型对象验证失败  

  8.         return "validate/error";  

  9.     }  

  10.     return "redirect:/success";  

  11. }  

每一个模型对象后边都需要跟一个Errors或BindingResult对象来保存验证结果,其方法体内部可以使用这两个验证结果对象来选择出错时跳转的页面或处理的逻辑。

4. Junit测试

当自定义拓展Validation时,可以使用如下方法进行测试:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

  1. @Test  

  2. public void testValidate() {  

  3.     AnnotationDescriptor<EqualsAny> descriptor = new AnnotationDescriptor<EqualsAny>(EqualsAny.class);  

  4.     EqualsAny equalsAny = AnnotationFactory.create(descriptor);  

  5.     EqualsAnyValidator equalsAnyValidator = new EqualsAnyValidator();  

  6.     equalsAnyValidator.initialize(equalsAny);  

  7.     Assert.assertTrue(equalsAnyValidator.isValid("123"null));  

  8. }  

另外再讲一点spring对自定义JSR-303限制类型支持的新特性,那就是Spring支持往ConstraintValidator里面注入bean对象。例如在EqualsAnyValidator中利用@Resource注解注入其他Bean对象。


优秀的个人博客,低调大师

微信关注我们

原文链接:https://blog.roncoo.com/article/127265

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。