前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >验证框架Hibernate Validator 分组

验证框架Hibernate Validator 分组

作者头像
wuweixiang
发布2018-08-14 11:08:22
1.3K0
发布2018-08-14 11:08:22
举报
文章被收录于专栏:吴伟祥吴伟祥

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

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

1. 分组

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

[java] view plain copy

代码语言:javascript
复制
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中的代码如下:

[java] view plain copy

代码语言:javascript
复制
@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 的序列。

[java] view plain copy

代码语言:javascript
复制
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

代码语言:javascript
复制
@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. 验证多个对象

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

[java] view plain copy

代码语言:javascript
复制
@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时,可以使用如下方法进行测试:

[java] view plain copy

代码语言:javascript
复制
@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对象。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017/04/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档