详解SpringMVC验证框架Validation特殊用法

作者:wangpeng047 时间:2023-06-08 22:23:29 

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

1. 分组

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


public class UserModel {

@NotNull(message = "{id.empty}", groups = { First.class })
 private int id;

@NotNull(message = "{username.empty}", groups = { First.class, Second.class })
 private String username;

@NotNull(message = "{content.empty}", groups = { First.class, Second.class })
 private String content;

public int getId() {
   return id;
 }

public void setId(int id) {
   this.id = id;
 }

public String getUsername() {
   return username;
 }

public void setUsername(String username) {
   this.username = username;
 }

public String getContent() {
   return content;
 }

public void setContent(String content) {
   this.content = content;
 }
}
public interface First {
}

public interface Second {
}

通过 groups 对验证进行分组

在controler中的代码如下:


@RequestMapping(value = "/save.action", method = RequestMethod.POST)
public String save(@Validated( { Second.class }) UserModel userModel, BindingResult result) {
 if (result.hasErrors()) {
   return "validate/error";
 }
 return "redirect:/success";
}

@RequestMapping(value = "/update.action", method = RequestMethod.POST)
public String update(@Validated( { First.class, Second.class }) UserModel user, BindingResult result) {
 if (result.hasErrors()) {
   return "validate/error";
 }
 return "redirect:/success";
}

2. 组序列

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

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

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


public interface GroupA {
}

public interface GroupB {
}

@GroupSequence( { Default.class, GroupA.class, GroupB.class })
public interface Group {
}

public class User {
 @NotEmpty(message = "firstname may be empty")
 private String firstname;

@NotEmpty(message = "middlename may be empty", groups = Default.class)
 private String middlename;

@NotEmpty(message = "lastname may be empty", groups = GroupA.class)
 private String lastname;

@NotEmpty(message = "country may be empty", groups = GroupB.class)
 private String country;
}
[java] view plain copy 在CODE上查看代码片派生到我的代码片
@RequestMapping(value = "/update.action", method = RequestMethod.POST)
public String register(@Validated(Group.class) User user, BindingResult result) {
 if (result.hasErrors()) {
   return "validate/error";
 }
 return "redirect:/success";
}

3. 验证多个对象

当我们在一个功能处理方法上需要验证多个模型对象时,需要通过如下形式来获取验证结果:


@RequestMapping("/validate/multi")
public String multi(@Valid @ModelAttribute("a") A a, BindingResult aErrors, @Valid @ModelAttribute("b") B b, BindingResult bErrors) {

if (aErrors.hasErrors()) { //如果a模型对象验证失败
   return "validate/error";
 }
 if (bErrors.hasErrors()) { //如果a模型对象验证失败
   return "validate/error";
 }
 return "redirect:/success";
}

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

4. Junit测试

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


@Test
public void testValidate() {
 AnnotationDescriptor<EqualsAny> descriptor = new AnnotationDescriptor<EqualsAny>(EqualsAny.class);
 EqualsAny equalsAny = AnnotationFactory.create(descriptor);
 EqualsAnyValidator equalsAnyValidator = new EqualsAnyValidator();
 equalsAnyValidator.initialize(equalsAny);
 Assert.assertTrue(equalsAnyValidator.isValid("123", null));
}

另外再讲一点spring对自定义JSR-303限制类型支持的新特性,那就是Spring支持往ConstraintValidator里面注入bean对象。例如在EqualsAnyValidator中利用@Resource注解注入其他Bean对象。

来源:http://blog.csdn.net/wangpeng047/article/details/41726299

标签:springmvc,验证
0
投稿

猜你喜欢

  • Spring Boot MQTT Too many publishes in progress错误的解决方案

    2023-06-27 02:16:44
  • javaweb Servlet开发总结(一)

    2023-04-08 22:52:32
  • 教你怎么用Java获取国家法定节假日

    2021-05-24 01:16:04
  • java实现MD5加密算法的实例代码

    2021-10-01 16:49:14
  • Spring Security保护用户密码常用方法详解

    2023-01-24 17:06:18
  • C#学习笔记之适配器模式详解

    2021-06-16 14:10:50
  • Android下拉刷新与轮播图滑动冲突解决方案

    2021-08-12 12:30:40
  • Java代理深入讲解之静态代理

    2022-10-25 14:56:12
  • Mybatis实现插入数据后返回主键过程解析

    2022-07-14 18:43:15
  • springboot使用AOP+反射实现Excel数据的读取

    2022-12-10 05:25:55
  • javascript开发随笔3 开发iframe富文本编辑器的一点体会

    2021-09-25 09:41:28
  • Windows下Flutter+Idea环境搭建及配置

    2022-01-22 18:12:13
  • Java保留两位小数的几种写法总结

    2022-04-19 06:53:06
  • JAVA中的final关键字用法实例详解

    2021-06-25 12:10:08
  • SpringBoot@DeleteMapping(/xxx/{id})请求报405的解决

    2022-06-13 14:00:48
  • JDK 7U15在 Windows x86平台下的安装方法

    2023-04-09 07:31:08
  • springboot 自定义权限标签(tld),在freemarker引用操作

    2023-11-23 06:20:15
  • 深入Android 五大布局对象的应用

    2022-03-23 15:25:15
  • java在linux本地执行shell命令的实现方法

    2023-11-14 02:31:33
  • Android设置透明状态栏和透明导航栏

    2021-09-22 07:19:41
  • asp之家 软件编程 m.aspxhome.com