可以通过groups属性将Bean验证中的验证约束添加到一个或多个组。 这使您可以限制在验证期间应用的约束集。 在某些小组应先于其他小组进行验证(例如在向导中)的情况下,这可能很方便。 从Spring MVC 3.1开始,可以通过org.springframework.validation.annotation.Validated注释使用验证组进行自动验证。 在本文中,我将使用简单的Spring MVC应用程序来演示如何轻松使用验证组来验证Spring的MVC模型属性。

形成

让我们从将逐步验证的表单类开始。 首先,我们定义代表约束组的接口:

public class Account implements PasswordAware {interface ValidationStepOne {// validation group marker interface}interface ValidationStepTwo {// validation group marker interface}
}

验证约束

接下来,我们将约束分配给组。 请记住,如果您不提供组,则将使用默认组。 另请注意@SamePasswords@StrongPassword –自定义约束,必须定义groups属性:

@SamePasswords(groups = {Account.ValidationStepTwo.class})
public class Account implements PasswordAware {@NotBlank(groups = {ValidationStepOne.class})private String username;@Email(groups = {ValidationStepOne.class})@NotBlank(groups = {ValidationStepOne.class})private String email;@NotBlank(groups = {ValidationStepTwo.class})@StrongPassword(groups = {ValidationStepTwo.class})private String password;@NotBlank(groups = {ValidationStepTwo.class})private String confirmedPassword;// getters and setters
}

巫师

有了Account ,我们可以创建一个三步向导@Controller ,该向导将允许用户创建一个帐户。 第一步,我们将让Spring验证ValidationStepOne组中的约束:

@Controller
@RequestMapping("validationgroups")
@SessionAttributes("account")
public class AccountController {@RequestMapping(value = "stepOne")public String stepOne(Model model) {model.addAttribute("account", new Account());return VIEW_STEP_ONE;}@RequestMapping(value = "stepOne", method = RequestMethod.POST)public String stepOne(@Validated(Account.ValidationStepOne.class) Account account, Errors errors) {if (errors.hasErrors()) {return VIEW_STEP_ONE;}return "redirect:stepTwo";}
}

为了触发组的验证,我使用了@Validated注解。 该批注采用带有组类型的var-arg参数。 代码@Validated(ValidationStepOne.class)触发ValidationStepOne组中约束的ValidationStepOne

在下一步中,我们将让Spring在ValidationStepTwo组中验证约束:

@Controller
@RequestMapping("validationgroups")
@SessionAttributes("account")
public class AccountController {@RequestMapping(value = "stepTwo")public String stepTwo() {return VIEW_STEP_TWO;}@RequestMapping(value = "stepTwo", method = RequestMethod.POST)public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account, Errors errors) {if (errors.hasErrors()) {return VIEW_STEP_TWO;}return "redirect:summary";}
}

在摘要步骤中,我们将确认输入的数据,并让Spring验证两组的约束:

@Controller
@RequestMapping("validationgroups")
@SessionAttributes("account")
public class AccountController {@RequestMapping(value = "summary")public String summary() {return VIEW_SUMMARY;}@RequestMapping(value = "confirm")public String confirm(@Validated({Account.ValidationStepOne.class, Account.ValidationStepTwo.class}) Account account, Errors errors, SessionStatus status) {status.setComplete();if (errors.hasErrors()) {// did not pass full validation}return "redirect:start";}
}

在Spring 3.1之前,您可以手动触发验证。 我在以前的一篇文章中对此进行了描述: http : //blog.codeleak.pl/2011/03/how-to-jsr303-validation-groups-in.html

注意:如果要在不使用Spring的情况下使用验证组,则需要将组传递给javax.validation.Validator#validate()

没有Spring的验证组

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Account account = new Account();// validate with first group
Set<ConstraintViolation<Account>> constraintViolations =validator.validate(account, Account.ValidationStepOne.class);
assertThat(constraintViolations).hasSize(2);// validate with both groups
Set<ConstraintViolation<Account>> constraintViolations =validator.validate(account, Account.ValidationStepOne.class, Account.ValidationStepTwo.class);
assertThat(constraintViolations).hasSize(4);

这也是测试验证的最简单方法:

public class AccountValidationTest {private Validator validator = Validation.buildDefaultValidatorFactory().getValidator();@Testpublic void shouldHaveFourConstraintViolationsWhileValidatingBothGroups() {Account account = new Account();Set<ConstraintViolation<Account>> constraintViolations = validator.validate(account, Account.ValidationStepOne.class, Account.ValidationStepTwo.class);assertThat(constraintViolations).hasSize(4);}@Testpublic void shouldHaveTwoConstraintViolationsWhileStepOne() {Account account = new Account();Set<ConstraintViolation<Account>> constraintViolations = validator.validate(account, Account.ValidationStepOne.class);assertThat(constraintViolations).hasSize(2);}
}

使用Spring Test进行测试验证

如果验证/绑定失败,使用Spring Test进行测试验证将提供更复杂的测试方法。 对于示例,请查看我的另一篇博客文章: Spring MVC集成测试:断言给定的模型属性具有全局错误

  • 可以在这里找到本文的源代码: https : //github.com/kolorobot/spring-mvc-beanvalidation11-demo

翻译自: https://www.javacodegeeks.com/2014/08/validation-groups-in-spring-mvc.html

Spring MVC中的验证组相关推荐

  1. JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践

    任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层, ...

  2. Spring 2.5:Spring MVC中的新特性

    转载说明:infoQ就是牛人多,看人家去年就把Spring2.5注视驱动的MVC写出来了,还是这么详细,我真是自叹不如,今天偶尔看到这篇文章非常认真的拜读了2遍,简直是茅厕顿开啊....\(^o^)/ ...

  3. 在Spring MVC中使用Apache Shiro安全框架

    我们在这里将对一个集成了Spring MVC+Hibernate+Apache Shiro的项目进行了一个简单说明.这个项目将展示如何在Spring MVC 中使用Apache Shiro来构建我们的 ...

  4. Spring MVC 中的基于注解的 Controller

    为什么80%的码农都做不了架构师?>>>    Spring MVC 中的基于注解的 Controller @Controller 基于注解的 Controller   终于来到了基 ...

  5. Spring MVC 中的http Caching

    文章目录 过期时间 Last-Modified ETag Spring ETag filter Spring MVC 中的http Caching Cache 是HTTP协议中的一个非常重要的功能,使 ...

  6. 11月30在spring mvc中使用Validator框架和文件上传

    首先回顾了spring mvc中的表单验证和业务逻辑校验失败后,回到表单页面中显示错误信息的整个内部运行流程. 表单校验出错后回到表单注册页面是由默认的SimpleFormController的pro ...

  7. Spring MVC表单验证(带批注)

    这篇文章提供了一个简单HTML表单验证示例. 它基于带有注释的Spring MVC示例. 该代码可在GitHub的Spring-MVC-Form-Validation目录中找到. 数据 在此示例中,我 ...

  8. SSM框架笔记14:Spring MVC表单验证

    Spring MVC表单验证   在Spring MVC中,表单验证有三种方法.   一.基本校验 这种方法是基于handler的,优点是定义方便,缺点是不便于复用. 1.两个接口:Errors/Bi ...

  9. Spring MVC中redirect重定向3种方式(带参数)

    Spring MVC中做form表单功能提交时,防止用户客户端后退或者刷新时重复提交问题,需要在服务端进行重定向跳转,其中redirect是直接跳转到其他页面,有以下3种方法进行重定向. redire ...

最新文章

  1. ubuntu 常见配置文件
  2. 分布式系列文章——Paxos算法原理与推导
  3. [转发]SPRING MVC3.2案例讲解--SPRING MVC3的@ResponseBody和ResponseEntity
  4. Modelsim se仿真Xilinx IPcore
  5. MyBatis的功能架构是怎样的
  6. onedrive-cf-index 搭建教程
  7. teststand调用python模块_NI TestStand 2019下载-测试管理软件NI TestStand 2019下载v19.0.1 官方版-西西软件下载...
  8. mysql replace 不区分大小写_mysql 不区分大小写的解决
  9. 筛选出c语言成绩前五名的记录,c语言课程论文设计成绩记录簿.doc
  10. AI和大数据结合,智能运维平台助力流利说提升竞争力
  11. android手机视频,安卓手机视频加密软件
  12. 二维码图片处理换logo,加文字
  13. 11月 | Gauss松鼠会活动回顾总结
  14. docker安装memos
  15. linux socket write()函数阻塞卡住线程问题(线程无法结束)write()非阻塞代码
  16. 2022年研究一下PC微信 HOOK 技术(版本:3.4.5.27)
  17. C / C++ 计算程序运行的时间
  18. 4k水面折射maya循环纹理支持arnold
  19. 小程序中的unionid
  20. 煤炭运销业务中作弊现象与防作弊措施

热门文章

  1. 如何安装mysql5.5.6_centos6安装mysql5.5.53
  2. latex 数学公式_技能分享——LaTeX篇I
  3. jvm(4)-虚拟机性能监控与故障处理工具
  4. 算法运行时间中的对数
  5. leetcode初级算法3.存在重复元素
  6. Redis两种客户端:lettuce和Jedis的区别
  7. java12关键字var_Java 10:“ var”关键字
  8. jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表
  9. eap和psk_针对WildFly和EAP运行Java Mission Control和Flight Recorder
  10. 只读副本和Spring Data第1部分:配置数据库