Spring MVC中的验证组

logo-spring-io

可以通过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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简而言之,JUnit:Hello World

对于Java世界中的开发人员而言&#xff0c; JUnit似乎是最受欢迎的测试工具 。 因此&#xff0c;难怪就此主题已经写了一些好书 。 但是&#xff0c;通过以顾问为生&#xff0c;我仍然经常遇到程序员&#xff0c;他们至多对工具及其正确用法都不了解。 因此&#xff0c;我想到…

命令设计模式的应用

嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将与您分享一种非常出色的编程设计模式。 它有很多用法&#xff0c;是我的最爱之一。 编程设计模式命令具有多种用例。 在这篇文章中&#xff0c;我们将看到如何实现现实世界中的某些东西。 我们将使用电子汽车钥匙来打开&…

adodb.stream对象的方法/属性

cancel 方法 使用方法如下 object.cancel 说明&#xff1a;取消执行挂起的异步 execute 或 open 方法的调用。 close 方法 使用方法如下 object.close &#xff1a;关闭对像 copyto 方法 使用方法如下 object.copyto(deststream,[charnumber]) 说明&#xff1a;将对像的数据复制…

MongoDB非关系型数据库开发手册

一&#xff1a;NoSql数据库 什么是NoSQL? NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。&#xff08;例如谷歌或Facebook每天为他们的用户收…

解决DataGridView绑定List后不能排序的问题

阅读全文并下载例子 &#xff1a;http://www.sufeinet.com/forum.php?modviewthread&tid190 以前不都是用table直接绑定DataGridView的&#xff0c;没有出现过不能排序的问题&#xff0c;初试List结果发现不管怎么样都不能实现排序的功能&#xff0c;有朋友说 DataGridVie…

maven编译的时候排除junit测试类

maven编译的时候排除junit测试类 maven项目中使用junit进行单元测试&#xff0c;在进行编译的时候&#xff0c;可以通过2种方式排除test测试类的编译。 有2种方式 &#xff1a; 使用命令的时候带上参数 mvn install -Dmaven.test.skiptrue 在pom.xml里面配置<plugins><…

生成器设计模式的应用

嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将分享我制作的全新设计模式系列的第一个。 构建器设计模式是开发严肃的应用程序时非常有用且通用的模式。 在这篇文章中&#xff0c;我将提供一个很小的构建器模式框架&#xff0c;因此您随时可以回到这里并使用它。 助记…

知识整理2019清北学堂提高储备D5

今天主讲图论。 前言&#xff1a;图的定义&#xff1a;图G是一个有序二元组(V,E)&#xff0c;其中V称为顶集(Vertices Set)&#xff0c;E称为边集(Edges set)&#xff0c;E与V不相交。它们亦可写成V(G)和E(G)。 一、图的存储&#xff1a; 1、邻接矩阵&#xff1a; 2、邻接表&am…

CSS之文字溢出处理

1.单行文本之三剑客<p>刘诗诗&#xff0c;原名刘诗施&#xff0c;1987年3月10日出生于北京市&#xff0c;中国内地影视女演员、影视出品人。</p>p{border: 1px solid red;width: 400px;height: 40px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis…

GA,RC,Alpha,Beta,Final等软件版本名词释义

对应上图的表格如下&#xff1a; 名词&#xff01;说明Alphaα是希腊字母的第一个&#xff0c;表示最早的版本&#xff0c;内部测试版&#xff0c;一般不向外部发布&#xff0c;bug会比较多&#xff0c;功能也不全&#xff0c;一般只有测试人员使用。Betaβ是希腊字母的第二个&…

HawtIO在JBoss EAP上(第二部分)

我刚刚发布了一篇关于在JBoss Wildfly 8.1上运行HawtIO的条目 。 从那篇文章中&#xff0c;您将了解HawtIO多么出色 &#xff0c;以及它必须具备的所有 出色 插件&#xff0c;才能从单个仪表板管理基于JVM的技术……好吧…… hawt ……。 但是&#xff0c;出于上一篇文章中概述…

Mule ESB,ActiveMQ和DLQ

在本文中&#xff0c;我将展示一个简单的Mule ESB流程&#xff0c;以了解实际中使用的Active MQ 的DLQ功能 。 我假设您有一个正在运行的Apache ActiveMQ实例&#xff08;如果没有&#xff0c;则可以在此处下载一个版本&#xff09;。 在此示例中&#xff0c;我使用了Mule ESB…

Choose and Divide UVa 10375

题目大意&#xff1a;给出p,q,r,s&#xff0c;求组合数C(p,q)/C(r,s) 题目思路&#xff1a; 化简得到&#xff1a;原式等价于(p!(r-s)!s!) / (r!(p-q)!q!) 由算数基本定理可知任意一个正整数可被唯一分解为素数幂乘积的形式&#xff0c;将分子分母分解后&#xff0c;进行约分即…

Linux sudo 详解

简单的说&#xff0c;sudo 是一种权限管理机制&#xff0c;管理员可以授权于一些普通用户去执行一些 root 执行的操作&#xff0c;而不需要知道 root 的密码。严谨些说&#xff0c;sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然&#xff0c;能做什么…

echarts自定义图例legend文字和样式

话不多说&#xff0c;先上效果图。 要完成这个图并不难&#xff0c;主要是下面那个图例比较难&#xff0c;需要定制。 让我们从官方文档找找思路&#xff0c;官方文档关于legend.formatter是这样的&#xff1a;链接在这 难点在于&#xff1a; 1.这里的图例文本包含两个变量&am…

【题解】整理书本

题目描述 小A想把他满屋子的书整理一下。书本分成若干堆。每一堆的书本都有质量w和价值v。小A的任务是将所有书合成一堆。因为小A认为合并i&#xff0c;j两堆的书所需要的力为w[i]-v[i]w[j]-v[j]。合并后的书堆的质量和价值均为合并前两堆书的质量和价值的总和。也就是说&#…

JBoss Wildfly 8.1上的HawtIO

HawtIO为基于JVM的中间件提供了令人赞叹的视觉效果。 它是应用程序的统一控制台&#xff0c;否则将不得不构建自己的糟糕的Web控制台。 老实说&#xff0c;它们的构建方式各不相同&#xff0c;技术不同&#xff0c;用户体验不同&#xff0c;并且都围绕一种可怕的方式来尝试在QA…

jsp实现上一页下一页翻页功能

前段时间一直忙于期末考试和找实习&#xff0c;好久没写博客了。 这段时间做了个小项目&#xff0c;包含了翻页和富文本编辑器Ueditor的两个知识点,Ueditor玩的还不是很深&#xff0c;打算玩深后再写篇博客。 要实现翻页功能&#xff0c;只需要设置一个pageIndex即可&#xf…

自定义Cassandra数据类型

在博客文章《 从Java连接到Cassandra》中 &#xff0c;我提到了用Java 实现的Cassandra Java开发人员的一个优势是能够创建自定义 Cassandra数据类型 。 在这篇文章中&#xff0c;我将详细介绍如何执行此操作。 Cassandra具有许多内置的数据类型 &#xff0c;但是在某些情况下…

Docker的安装及注意事项

Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#…