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

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

SpringMVC验证框架Validation特殊用法的更多相关文章

  1. Spring BindingResult验证框架Validation特殊用法

    使用注解@Valid(实体属性校验) Springboot实现 Spring实现 一.准备校验时使用的JAR validation-api-1.0.0.GA.jar:JDK的接口: hibernate ...

  2. struts2 的验证框架validation如何返回json数据 以方便ajax交互

    struts2 的验证框架validation简单,好用,但是input只能输出到jsp页面通过struts2的标签<s:fielderror  />才能取出,(EL应该也可以). 如果使 ...

  3. Struts2 验证框架 validation.xml 常用的验证规则

    validation.xml 的命名规则和放置路径: 文件名:<ActionClassName>-validation.xml <ActionClassName>就是要验证的A ...

  4. Hibernate validation 注解 springmvc 验证 分组

    SpringMVC验证框架Validation特殊用法   1. 分组 有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需 ...

  5. SpringMVC 使用验证框架 Bean Validation(上)

    SpringMVC 使用验证框架 Bean Validation(上) 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证. ...

  6. Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  7. @Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...

  8. Hibernate Validation,Spring mvc 数据验证框架注解

    1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...

  9. 如何在SSM项目配置springMVC校验框架validator

    1.在springMVC配置文件配置添加如下信息 <!-- 表单验证框架 --> <bean id="validator" class="org.spr ...

随机推荐

  1. C++11 bind

    #include <iostream> #include <functional> using namespace std; int func(int a, int b) { ...

  2. 怎样把XP系统装到USB里?

    怎么样在usb(usb闪存)里面装XP系统? 就是把usb当硬盘用 不买硬盘. U盘肯定装不了系统,装进去了也肯定蓝屏.为什么?因为USB得数据传输太慢,不会超过10M/S的,而你的IDE口或者SAT ...

  3. AngularJS报错:[$injector:unpr] Unknown provider: $templateRequestProvider

    在页面中由上到下引用了: angular.js angular-route.js 创建model的时候也写明了依赖: var someApp = angular.module('someApp',[' ...

  4. Excel部署配置DCOM

    对 Excel进行编程,实际上就是通过 .Net Framework去调用 Excel的 COM组件,所有要在 Web环境下调用 COM组件的时候,都需要对其进行相应的配置. 很多朋友都反映在 Win ...

  5. centos7虚拟机(vmware)通过U盘传文件

    centos7虚拟机(vmware)通过U盘传文件 centos7虚拟机安装以后,WINDOWS给CENTOS7传文件,除了在CENTOS7安装SAMBA外,其实通过U盘也是可以的. CENTOS7对 ...

  6. C#编程(四十九)----------队列

    队列 1.Queue定义 System.Collections.Queue类表示对象的先进先出集合,存储在Queue(队列)中的对象在一端插入,从另一端移除. 2.优点 (1).能对集合进行顺序处理( ...

  7. [Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runn ...

  8. Java获取URL链接的文件类型

    问题发生: Java从网络批量读取图片并保存至本网站服务器后再插入文章中 今天转入一篇文章 http://news.qq.com/a/20170605/045860.htm 发现图片未能成功上传 查看 ...

  9. 无耻之徒(美版)第七季/全集Shameless US迅雷下载

    英文全名Shameless (US),第7季(2016).本季看点:<无耻之徒>(Shameless)第七季.本季故事起始于「一个月之后」,Frank从昏迷中醒来后得知亲人背叛了他,于是向 ...

  10. 抄袭证据之中的一个CMM与CMMI的名称

    以下文字来自我即将完毕的文章,谢博士说她没有抄袭,可是文中实在是有太多的漏洞了. 6.2.7 P120页中: "实际上终于所谓的统一方法论就是标准,尽管作标准并非目的.但标准是必须有的.能够 ...