SpringMVC 支持Hibernate Validator

发表于9个月前(2014-08-04 11:34)   阅读(1780) | 评论(0) 11人收藏此文章, 我要收藏
赞0

5月23日 西安 OSC 源创会开始报名啦,存储、虚拟机、Docker 等干货分享

摘要 这段时间看公司的代码都是代码中对数据进行显性的验证,在业务逻辑中混杂了太多的数据校验的代码,感觉各种不舒服,正好趁今天有些空闲,就将SpringMVC整合了下Hibernate Validator。现在记录下整合过程,过程以便以后参考!

一、基础框架 SpringMVC-4.0.3.RELEASE,使用的maven来管理jar依赖

二、依赖的jar,

1
2
3
4
5
  <dependency>  
       <groupId>org.hibernate</groupId>  
       <artifactId>hibernate-validator</artifactId>  
       <version>5.0.2.Final</version>  
 </dependency>

上面是对Hibernate Validator 支持所需要的包,spring的jar省略。

三、spring配置文件 applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<mvc:annotation-driven validator="validator" />
    <!-- 以下 validator  ConversionService 在使用 mvc:annotation-driven 会 自动注册-->  
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">  
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>  
        <!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties -->  
        <property name="validationMessageSource" ref="messageSource"/>  
    </bean>  
       
    <!-- 国际化的消息资源文件(本系统中主要用于显示/错误消息定制) -->  
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
        <property name="basenames">  
            <list>  
                <!-- 在web环境中一定要定位到classpath 否则默认到当前web应用下找  -->  
                <value>classpath:messages</value>  
                <value>classpath:org/hibernate/validator/ValidationMessages</value>  
            </list>  
        </property>  
        <property name="useCodeAsDefaultMessage" value="false"/>  
        <property name="defaultEncoding" value="UTF-8"/>  
        <property name="cacheSeconds" value="60"/>  
    </bean>

经过上面三步,就可以让SpringMVC支持hibernate Validator,可以说整合已大功告成。现在看看具体使用

四、需要验证的实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class IssueMessageBO {
 
    @NotNull(message="{message.content.empty}"// 将验证消息写在classpath下message.properties
    @Size(min = 2, max = 140,message="{message.content.length}")
    private String content;//发布内容
    private String qiniuImgInfo;//七牛图片信息
    @NotNull(message="{message.schoolIds.empty}")
    private String schoolIds;//学校
    private int publisherType;//发布者类型
    private boolean hasTop;//是否置顶
    private int topDay; //置顶的天数
    ....
}

JSR-303只是一个规范,而Spring也没有对这一规范进行实现,那么当我们在SpringMVC中需要使用到JSR-303的时候就需要我们提供一个对JSR-303规范的实现,Hibernate Validator是实现了这一规范的,这里我将以它作为JSR-303的实现来讲解SpringMVC对JSR-303的支持。

JSR-303的校验是基于注解的,它内部已经定义好了一系列的限制注解,我们只需要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上.

JSR-303原生支持的限制有如下几种

除了JSR-303原生支持的限制类型之外我们还可以定义自己的限制类型。定义自己的限制类型首先我们得定义一个该种限制类型的注解,而且该注解需要使用@Constraint标注。

五、controller中的数据验证

1
2
3
4
5
6
7
8
9
10
        @RequestMapping(value = "/addMessage.action", method = RequestMethod.POST)
    public @ResponseBody String addMessage(HttpServletRequest request, HttpServletResponse response,@Valid IssueMessageBO issueMessageBO,BindingResult result)throws IOException{
        Result retVal = ValidatorResultHandler.handle(result);
        if(retVal.getStatus() == Const.FAILURE){
            response.getWriter().write(JSON.toJSONString(retVal));
        }else{
            response.getWriter().write(JSON.toJSONString(treeholeMessageService.issueMessage(issueMessageBO)));
        }
        return null;
    }

在  applicationContext.xml 加入了

1
<mvc:annotation-driven validator="validator" />

Spring会自动检测classpath下的JSR-303提供者并自动启用对JSR-303的支持,把对应的校验错误信息放到Spring的Errors对象中

然后我使用了 validatorResultHandler 类来处理验证结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ValidatorResultHandler {
 
    public static Result handle(BindingResult result){
        Result retVal = new Result();
         
        if(result.hasErrors()){
            List<ObjectError> list = result.getAllErrors();
            ObjectError oe = list.get(0);
            retVal.setMessage(oe.getDefaultMessage());
        }else{
            retVal.setStatus(Const.SUCCESS);
        }
        return retVal;
    }
}

这样处理就完成了。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class UserModel {
    private int id;
     
    private String username;
     
    private String content;
    @NotNull(message="{id.empty}",groups={First.class})
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
     
    @NotNull(message="{username.empty}",groups = {First.class, Second.class})
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @NotNull(message="{content.empty}",groups = {First.class, Second.class})
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
}

通过 groups 对验证进行分组

在controler中的代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@RequestMapping(value = "/save.action", method = RequestMethod.POST)
public @ResponseBody String save(HttpServletRequest request, HttpServletResponse response,@Validated({ Second.class}) UserModel userModel,BindingResult result) throws IOException{
    response.setCharacterEncoding("utf-8");
    System.out.println("----"+userModel.getUsername());
    if(result.hasErrors()){
        List<ObjectError> list = result.getAllErrors();
        for(ObjectError objectError:list){
            System.out.println(objectError.getDefaultMessage());
        }
        response.getWriter().write(JSON.toJSONString(list));
        return null;
    }
    response.getWriter().write("rrrrrr");
    return null;
}
 
@RequestMapping(value = "/update.action", method = RequestMethod.POST)
public @ResponseBody String update(HttpServletRequest request, HttpServletResponse response,@Validated({First.class, Second.class}) UserModel user,BindingResult result) throws IOException{
    response.setCharacterEncoding("utf-8");
    if(result.hasErrors()){
        List<ObjectError> list = result.getAllErrors();
        for(ObjectError objectError:list){
            System.out.println(objectError);
        }
        response.getWriter().write(JSON.toJSONString(list));
        return null;
    }
    response.getWriter().write("rrrrrr");
    return null;
}

springMvc 支持hibernate validator的更多相关文章

  1. SpringMVC利用Hibernate validator做字段验证

    1.添加Hiberbate validator相关的jar包 2.字需要验证的formbean 上添加验证的注解,内置注解有: dBean Validation 中内置的 constraint @Nu ...

  2. JSR303的数据校验-Hibernate Validator方式实现

    1.什么是JSR303? JSR303是java为bean数据合法性校验所提供的一个标准规范,叫做Bean Validation. Bean Validation是一个运行时的数据校验框架,在验证之后 ...

  3. SpringMVC之使用Validator接口进行验证

    对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证.SpringMVC自身对数据在服务端的校验有一个比较好的支持,它能将我们提 ...

  4. hibernate validator 专题

    JSR-303 原生支持的限制有如下几种 : 限制 说明 @Null 限制只能为 null @NotNull 限制必须不为 null @AssertFalse 限制必须为 false @AssertT ...

  5. SpringMVC--使用hibernate validator数据校验

    JSR 303 Spring3开始支持JSR 303 验证框架,JSR303是Java为Bean数据合法性校验所提供的标准框架.JSR 303 支持XML和注解风格的验证,通过在Bean属性上标注类似 ...

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

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

  7. Hibernate validator验证

    spring-mvc配置 <mvc:annotation-driven validator="validator" /> <bean id="valid ...

  8. spring MVC 使用 hibernate validator验证框架,国际化配置

    spring mvc使用hibernate validator框架可以实现的功能: 1. 注解java bean声明校验规则. 2. 添加message错误信息源实现国际化配置. 3. 结合sprin ...

  9. hibernate Validator 6.X 的学习,bean的约束(字段,get方法上的验证)

    一:背景说明 验证数据是一个常见的任务,它贯穿于所有应用层,从呈现到持久层.通常在每个层中都执行相同的验证逻辑,耗时且容易出错.为了避免这些验证的重复,开发商往往把验证逻辑直接进入的领域模型,在领域类 ...

随机推荐

  1. chrome可以登陆账号的hosts文件

    原文地址: 百度 chrome吧 http://zhidao.baidu.com/question/1818688600091435508.html?qq-pf-to=pcqq.group http: ...

  2. Dark roads(kruskal)

    Dark roads Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Su ...

  3. Android SQLite Database Tutorial

    表名: 列(字段): 联系人实体类:构造方法,setters .getters方法 File:   Contact.java package com.example.sqlitetest; publi ...

  4. MVC中使用AuthorizeAttribute做身份验证操作【转】

    http://blog.csdn.net/try530/article/details/7782704 代码顺序为:OnAuthorization-->AuthorizeCore-->Ha ...

  5. Java压缩技术的学习

    由于工作的需要,经常要手动去打上线安装包,为了方便,自己写程序去帮助打包.使用过Unix或者Linux的人都基本上都用过tar打包以及gzip压缩,但在Windows下使用得最多的压缩还是RAR和Zi ...

  6. collectionView关于点击事件

    -(void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)i ...

  7. 清空DateTimePicker控件的好方法

    [控件ID,不要加这个方括号].Format = DateTimePickerFormat.Custom; [控件ID,不要加这个方括号].CustomFormat = " "; ...

  8. Sizzle一步步实现所有功能(一)

    前提: 1.HTML5自带querySelectAll可以完全替代Sizlle,所以我们下面写的Sizzle,是不考虑QSA的. 2.作者考虑了大量兼容情况,比如黑莓4.6系统这样几乎接触不到的bug ...

  9. javascript高级知识点——函数的长度

    代码信息来自于http://ejohn.org/apps/learn/. 函数的长度属性如何工作? function makeNinja(name){} function makeSamurai(na ...

  10. Fedora、CentOS install TTF/otf fonts

    Step 1:切换至字体下载目录: [Richard@localhost Downloads]$ ll | grep otf -rw-rw-r--. Richard Richard 7月 RBNo2L ...