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. 没有产品,没有用户的,绝对不要浪费时间去联系风投——没有过home run的创业人,想办法先做出产品,找到少量用户,没有任何销售成本

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Kuan Huang链接:http://www.zhihu.com/question/19641135/answer/1353 ...

  2. 初探ListView和Adapter

    关于Android Adapter(适配器),参考Devin Zhang’s blog.简单的说,Adapter起到的作用是使得前端的显示和后端的数据能够适配,用以下代码作为例子 1234567891 ...

  3. poj1316

    Self Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20864   Accepted: 11709 De ...

  4. ubuntu14.04 qt4开发环境搭建(vnc use gnome)

    1,安装qt开发环境软件包:apt-get install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer qtcreator; 2 ...

  5. Spring中自己主动装配

    自己主动装配 在我们了解过constructor-arg和property装配中.都须要配置对应的属性和值或者引用,假设在比較复杂的项目中.就会使得XML的配置变得复杂,自己主动装配能够使用较少的配置 ...

  6. poj3267--The Cow Lexicon(dp:字符串组合)

    The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8211   Accepted: 3864 D ...

  7. 任务管理器进程中多个chrome.exe的问题

    偶然发现任务管理器进程中有多个chrome.exe进程,非常奇怪自己仅仅打开了一次浏览器,为什么会有多个?! 上网一查才发现:原来使用Google浏览器Google Chrome每开一个新标签页面,都 ...

  8. C# 学习笔记 C#基础

    今天第一天开通博客.恰好在学习C#,所以就准备把学到的知识要点记录下来. 基础类型 类型定义了值得蓝图.值是一个被变量或者常量所指定的存储位置,变量是指可以被改变的,而常量则相反,其值不可以便改变, ...

  9. PHP与MySQL交互

    <?php $con = mysql_connect("localhost","root","12345"); $dbcharset ...

  10. OC中最难的一部分内容:内存管理

    OC中最难的一部分内容:内存管理为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Androi ...