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,一经查实,立即删除!

相关文章

表单美化

前面的话 由于一些系统原生的表单控件在各个浏览器中显示效果不一致&#xff0c;且无法设置某些关键CSS样式&#xff0c;为了保证表单在各浏览器中的兼容性&#xff0c;表单美化就是不得不做的一件事了 单选按钮 【实现效果】 style"width: 100%; height: 120px;" s…

【Python3.6】python打包成exe

D:\python_test>pip3 install pyinstaller…………D:\python_test>pyinstaller -F -w ui.py 84 INFO: PyInstaller: 3.3.1 85 INFO: Python: 3.6.4 88 INFO: Platform: Windows-10-10.0.15063-SP0 93 INFO: wrote D:\python_test\ui.spec 94 INFO: UPX is not available.…

算法题解:连续子数组的最大和及其下标

题目 输入一个整型数组&#xff0c;数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 举例 输入&#xff1a;2, -3, 4, 5, -9 输出&#xff1a;9 和最大的连续子数组是 {4, 5}&#xff0c;结果就是9。 思路…

简而言之,JUnit:Hello World

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

jQuery获取所有父级元素及同级元素及子元素的方法

jQuery获取所有父级元素及同级元素及子元素的方法 1.获取父级元素 $("#id").parent() 获取其父级元素 $("#id").parents() 获取其所有的祖先元素 $("#id").closest() 获取其最近的祖先元素&#xff0c;依次上溯 2.获取同级元素 $("#…

考取RHCE认证的历程,总结的经验

昨天去考试的&#xff0c;今天下午结果出来了&#xff0c;达到了我的预期。成功的获取了RHCE认证&#xff0c;以后我也是有证的人咯~&#xff0c;开个玩笑。 其实去年的时候我就曾经想要去考取的&#xff0c;我原来一直以为考取RHCE认证时考题都是英文的呢&#xff1f;因为我英…

Python萌新笔记

Mychael上了大学&#xff0c;对Python产生了浓厚的兴趣&#xff0c;便开始了Python的学习 学习的时候&#xff0c;感觉Python确实比以往学的C表达简洁很多&#xff0c;而又不失强大 以后的学习笔记就记在这啦 变量 Python中的变量无需声明&#xff0c;其类别也只有具体赋值的时…

明天一定要记得放一个硬币在口袋

以前上班总是从陆家嘴站下来&#xff0c;然后走到公司。现在改从东昌路站下。地铁陆家嘴站附近&#xff0c;现在正忙着收尾世博前的那些形象工程。满地的泥土、污水&#xff1b;空气中充斥着机器的轰鸣声、粉尘、烟雾、臭气。更让人难受的还有哪些长着&#xff0c;遭受了地震蹂…

命令设计模式的应用

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

代码块,-- 循环结构--字符串的格式化--字符串相关函数功能

### -代码块 以冒号作为开始,用缩进来划分相同的作用域,称之为代码块,代码块是一个整体,一个文件也可称代码块 作用域&#xff1a;作用的区域 ### -流程控制 (1)流程控制的定义 (2)流程控制的结构 ### -分支结构 关键字:if elif else (1)分支结构的种类 (2)分支结构的特点 ###…

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每天为他们的用户收…

Spring Batch作为Wildfly模块

长期以来&#xff0c;Java EE规范缺少批处理API。 今天&#xff0c;这对于企业应用程序来说是必不可少的。 这是最后固定与JSR-352批处理应用程序的Java平台现在的Java EE提供7 JSR-352得到了它的的灵感Spring Batch的对手。 两者涵盖相同的概念&#xff0c;尽管生成的API有所不…

springCloud Eureka 注册中心原理及配置理解(一)

Eureka 原理与步骤原理&#xff1a;服务提供方启动后将注册到 注册中心&#xff0c;提供IP, 名字&#xff0c;什么服务等信息&#xff0c;服务调用方作为客户端注册到注册中心后&#xff0c;拉取注册中心的服务列表&#xff0c;在通过负载均衡调用对应的服务提供方。注册中心可…

react系列教程

这个系列将从基础语法讲起&#xff0c;把react全家桶都讲到&#xff0c;然后到具体的使用&#xff0c;最后完成后&#xff0c;会写一个完整的demo。 前置要求&#xff1a; 基本的CSS&#xff0c;JS要熟练。 部分ES6语法需要了解。可以参考下面提到的阮一峰老师的《ECMAScript …

解决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…

IIFE(立即执行函数表达式)

我们经常会看到这样的写法&#xff1a; ;(fuction () {// do something })() 这就是一个简单的IIFE&#xff08;立即执行函数表达式&#xff0c;immediately-invoked function expression&#xff09;了。 这样的写法有什么好处呢&#xff1f;来简单分析一下。 1. 开头的分…