zoukankan      html  css  js  c++  java
  • SpringMVC验证框架Validation特殊用法

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

    1. 分组

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

    [java] view plain copy
    1. public class UserModel {  
    2.   
    3.     @NotNull(message = "{id.empty}", groups = { First.class })  
    4.     private int id;  
    5.   
    6.     @NotNull(message = "{username.empty}", groups = { First.class, Second.class })  
    7.     private String username;  
    8.   
    9.     @NotNull(message = "{content.empty}", groups = { First.class, Second.class })  
    10.     private String content;  
    11.   
    12.     public int getId() {  
    13.         return id;  
    14.     }  
    15.   
    16.     public void setId(int id) {  
    17.         this.id = id;  
    18.     }  
    19.   
    20.     public String getUsername() {  
    21.         return username;  
    22.     }  
    23.   
    24.     public void setUsername(String username) {  
    25.         this.username = username;  
    26.     }  
    27.   
    28.     public String getContent() {  
    29.         return content;  
    30.     }  
    31.   
    32.     public void setContent(String content) {  
    33.         this.content = content;  
    34.     }  
    35. }  
    36. public interface First {  
    37. }  
    38.   
    39. public interface Second {  
    40. }  

    通过 groups 对验证进行分组

    在controler中的代码如下:

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    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.   
    9. @RequestMapping(value = "/update.action", method = RequestMethod.POST)  
    10. public String update(@Validated( { First.class, Second.class }) UserModel user, BindingResult result) {  
    11.     if (result.hasErrors()) {  
    12.         return "validate/error";  
    13.     }  
    14.     return "redirect:/success";  
    15. }  

    2. 组序列

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

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

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

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. public interface GroupA {  
    2. }  
    3.   
    4. public interface GroupB {  
    5. }  
    6.   
    7. @GroupSequence( { Default.class, GroupA.class, GroupB.class })  
    8. public interface Group {  
    9. }  
    10.   
    11. public class User {  
    12.     @NotEmpty(message = "firstname may be empty")  
    13.     private String firstname;  
    14.   
    15.     @NotEmpty(message = "middlename may be empty", groups = Default.class)  
    16.     private String middlename;  
    17.   
    18.     @NotEmpty(message = "lastname may be empty", groups = GroupA.class)  
    19.     private String lastname;  
    20.   
    21.     @NotEmpty(message = "country may be empty", groups = GroupB.class)  
    22.     private String country;  
    23. }  
    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    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
     在CODE上查看代码片派生到我的代码片
    1. @RequestMapping("/validate/multi")  
    2. public String multi(@Valid @ModelAttribute("a") A a, BindingResult aErrors, @Valid @ModelAttribute("b") B b, BindingResult bErrors) {  
    3.   
    4.     if (aErrors.hasErrors()) { //如果a模型对象验证失败  
    5.         return "validate/error";  
    6.     }  
    7.     if (bErrors.hasErrors()) { //如果a模型对象验证失败  
    8.         return "validate/error";  
    9.     }  
    10.     return "redirect:/success";  
    11. }  

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

    4. Junit测试

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

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    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对象。






  • 相关阅读:
    系统集群安装
    用ASP.net判断上传文件类型的三种方法
    C#中利用JQuery实现视频网站
    云计算和大数据
    c# Dictionary 中Keys.ToArray<>方法的细节测试
    DateTime compare
    Dictionary的遍历和修改
    C# 键值对数据排序
    ant使用小结
    给我们的7句话
  • 原文地址:https://www.cnblogs.com/jeffen/p/6402480.html
Copyright © 2011-2022 走看看