博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC验证框架Validation特殊用法
阅读量:5808 次
发布时间:2019-06-18

本文共 3886 字,大约阅读时间需要 12 分钟。

hot3.png

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

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;  }
@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
descriptor = new AnnotationDescriptor
(EqualsAny.class); EqualsAny equalsAny = AnnotationFactory.create(descriptor); EqualsAnyValidator equalsAnyValidator = new EqualsAnyValidator(); equalsAnyValidator.initialize(equalsAny); Assert.assertTrue(equalsAnyValidator.isValid("123", null)); }

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

转载于:https://my.oschina.net/u/2246951/blog/812928

你可能感兴趣的文章
cookie的一些细节
查看>>
JAVA包命名规范
查看>>
[置顶] 大型网站技术架构(二)架构模式
查看>>
HDU 3268 Columbus’s bargain
查看>>
QT pri 文件的作用
查看>>
Callable与Future、FutureTask的学习 & ExecutorServer 与 CompletionService 学习 & Java异常处理-重要...
查看>>
excl筛选求和
查看>>
Dapper ORM 用法—Net下无敌的ORM(转)
查看>>
kafka_2.11-0.8.2.1单机版安装
查看>>
Linux目录结构及用途
查看>>
钩针纺织资料
查看>>
队列的实现
查看>>
SWFUpload使用指南
查看>>
所谓厉害的人,遇到问题时的思维模式与我们的差别在哪?(转自知乎)
查看>>
amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示...
查看>>
poj 2104 K-th Number 主席树+超级详细解释
查看>>
乐透TV:php 优酷视频采集,小示例(基于phpquery)
查看>>
企业架构研究总结(37)——TOGAF企业连续体和工具之架构资源库及架构工具的选择...
查看>>
Openstack_通用模块_Oslo_vmware 创建 vCenter 虚拟机快照
查看>>
方法编写经验总结
查看>>