SpringMVC验证框架Validation特殊用法

简介:

SpringMVC验证框架Validation特殊用法http://www.bieryun.com/1062.html

基本用法不说了,网上例子很多,这里主要介绍下比较特殊情况下使用的方法。

1. 分组

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

[java] view plain copy

  1. public class UserModel {
  2.     @NotNull(message = "{id.empty}", groups = { First.class })
  3.     private int id;
  4.     @NotNull(message = "{username.empty}", groups = { First.class, Second.class })
  5.     private String username;
  6.     @NotNull(message = "{content.empty}", groups = { First.class, Second.class })
  7.     private String content;
  8.     public int getId() {
  9.         return id;
  10.     }
  11.     public void setId(int id) {
  12.         this.id = id;
  13.     }
  14.     public String getUsername() {
  15.         return username;
  16.     }
  17.     public void setUsername(String username) {
  18.         this.username = username;
  19.     }
  20.     public String getContent() {
  21.         return content;
  22.     }
  23.     public void setContent(String content) {
  24.         this.content = content;
  25.     }
  26. }
  27. public interface First {
  28. }
  29. public interface Second {
  30. }

通过 groups 对验证进行分组

在controler中的代码如下:

[java] view plain copy

  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. @RequestMapping(value = "/update.action", method = RequestMethod.POST)
  9. public String update(@Validated( { First.class, Second.class }) UserModel user, BindingResult result) {
  10.     if (result.hasErrors()) {
  11.         return "validate/error";
  12.     }
  13.     return "redirect:/success";
  14. }

2. 组序列

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

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

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

[java] view plain copy

  1. public interface GroupA {
  2. }
  3. public interface GroupB {
  4. }
  5. @GroupSequence( { Default.class, GroupA.class, GroupB.class })
  6. public interface Group {
  7. }
  8. public class User {
  9.     @NotEmpty(message = "firstname may be empty")
  10.     private String firstname;
  11.     @NotEmpty(message = "middlename may be empty", groups = Default.class)
  12.     private String middlename;
  13.     @NotEmpty(message = "lastname may be empty", groups = GroupA.class)
  14.     private String lastname;
  15.     @NotEmpty(message = "country may be empty", groups = GroupB.class)
  16.     private String country;
  17. }

[java] view plain copy

  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

  1. @RequestMapping("/validate/multi")
  2. public String multi(@Valid @ModelAttribute("a") A a, BindingResult aErrors, @Valid @ModelAttribute("b") B b, BindingResult bErrors) {
  3.     if (aErrors.hasErrors()) { //如果a模型对象验证失败
  4.         return "validate/error";
  5.     }
  6.     if (bErrors.hasErrors()) { //如果a模型对象验证失败
  7.         return "validate/error";
  8.     }
  9.     return "redirect:/success";
  10. }

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

4. Junit测试

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

[java] view plain copy

  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对象。

相关文章
|
6月前
|
前端开发 JavaScript Java
JAVAEE框架技术之4springMVC入门
JAVAEE框架技术之4springMVC入门
132 0
JAVAEE框架技术之4springMVC入门
|
6月前
|
Java 数据库连接 Maven
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!
|
6月前
|
Java 数据库 数据安全/隐私保护
基于SSM框架实现管科类考研自我管理系统(分前后台spring+springmvc+mybatis+maven+jsp+jquery)
基于SSM框架实现管科类考研自我管理系统(分前后台spring+springmvc+mybatis+maven+jsp+jquery)
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
XML 前端开发 Java
深入理解SpringMVC工作原理,像大牛一样手写SpringMVC框架
对于SpringMVC相信诸位并不陌生,这是Java开发过程中使用最频繁的框架,在你的项目中可能不一定用MyBatis,但绝对会使用SpringMVC,因为操作数据库还有Hibernate、JPA等其他ORM框架选择,但SpringMVC这个框架在其领域中,可谓是独领风骚
|
6月前
|
前端开发 Java Apache
JAVAEE框架技术之6-springMVC拦截器和文件上传功能
JAVAEE框架技术之6-springMVC拦截器和文件上传功能
99 0
JAVAEE框架技术之6-springMVC拦截器和文件上传功能
|
5月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
6月前
|
Java BI 数据库
基于SSM框架实现面向小微企业的简历管理系统企业简历管理系统(分前后台spring+springmvc+mybatis+maven+jsp+css+echarts)
基于SSM框架实现面向小微企业的简历管理系统企业简历管理系统(分前后台spring+springmvc+mybatis+maven+jsp+css+echarts)
|
6月前
|
前端开发 Java 关系型数据库
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
|
6月前
|
前端开发 Java 应用服务中间件
Spring MVC框架概述
Spring MVC 是一个基于Java的轻量级Web框架,采用MVC设计模型实现请求驱动的松耦合应用开发。框架包括DispatcherServlet、HandlerMapping、Handler、HandlerAdapter、ViewResolver核心组件。DispatcherServlet协调这些组件处理HTTP请求和响应,Controller处理业务逻辑,Model封装数据,View负责渲染。通过注解@Controller、@RequestMapping等简化开发,支持RESTful请求。Spring MVC具有清晰的角色分配、Spring框架集成、多种视图技术支持以及异常处理等优点。
78 1