http://blog.csdn.net/lwphk/article/details/43983669

Hibernate validator使用

导入validation-api-xxx.jar 以及  hibernate-validator-xxx.Final.jar

需要检查的java bean 
Entity.java
  1. import javax.validation.constraints.Max;
  2. import org.hibernate.validator.constraints.Length;
  3. public class Entity {
  4. @Max(value=3)//最大值为3
  5. private int age;
  6. @Length(max=1) //字符串长度最大为1,hibernate 扩展的
  7. private String name;
  8. public int getAge() {
  9. return age;
  10. }
  11. public void setAge(int age) {
  12. this.age = age;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. }

值校验的测试类

  1. import java.util.Set;
  2. import javax.validation.ConstraintViolation;
  3. import javax.validation.Validation;
  4. import javax.validation.Validator;
  5. import javax.validation.ValidatorFactory;
  6. public class Tv {
  7. public static void main(String[] args) {
  8. ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
  9. Validator validator = factory.getValidator();
  10. Entity entity = new Entity();
  11. entity.setAge(12);
  12. entity.setName("admin");
  13. Set<ConstraintViolation<Entity>> constraintViolations = validator.validate(entity);
  14. for (ConstraintViolation<Entity> constraintViolation : constraintViolations) {
  15. System.out.println("对象属性:"+constraintViolation.getPropertyPath());
  16. System.out.println("国际化key:"+constraintViolation.getMessageTemplate());
  17. System.out.println("错误信息:"+constraintViolation.getMessage());
  18. }
  19. }
  20. }

输出结果


这里有一个国际化的key值,国际化文件在org.hibernate.validator下面的一系列的properites文件里面,如果需要自定义那么可以拷贝出来放在src目录下
 
这里我们拷贝一个出来,新增一个key为maxlength=字符串长度最大不能超过{max} ,可以使用动态参数,这里的max值就是注解里面设定的值
然后修改Entity.java,name属性的message="{maxlength}"
  1. @Length(max=1,message="{maxlength}") //{maxlength}对应配置文件中的key. 必须有{}
  2. private String name;

再次运行结果如下

自定义validator

首先自定义一个注解CannotContainSpaces (不能包含空格)

 
  1. import java.lang.annotation.Documented;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.Target;
  4. import javax.validation.Constraint;
  5. import javax.validation.Payload;
  6. @Constraint(validatedBy = CannotContainSpacesValidator.class) //具体的实现
  7. @Target( { java.lang.annotation.ElementType.METHOD,
  8. java.lang.annotation.ElementType.FIELD })
  9. @Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
  10. @Documented
  11. public @interface CannotContainSpaces {
  12. String message() default "{Cannot.contain.Spaces}"; //提示信息,可以写死,可以填写国际化的key
  13. int length() default 5;
  14. //下面这两个属性必须添加
  15. Class<?>[] groups() default {};
  16. Class<? extends Payload>[] payload() default {};
  17. }

具体实现类CannotContainSpacesValidator.java

 
  1. import javax.validation.ConstraintValidator;
  2. import javax.validation.ConstraintValidatorContext;
  3. public class CannotContainSpacesValidator implements ConstraintValidator<CannotContainSpaces, String> {
  4. private int len;
  5. /**
  6. * 初始参数,获取注解中length的值
  7. */
  8. @Override
  9. public void initialize(CannotContainSpaces arg0) {
  10. this.len = arg0.length();
  11. }
  12. @Override
  13. public boolean isValid(String str, ConstraintValidatorContext constraintValidatorContext) {
  14. if(str != null){
  15. if(str.indexOf(" ") < 0){
  16. return true;
  17. }
  18. }else{
  19. constraintValidatorContext.disableDefaultConstraintViolation();//禁用默认的message的值
  20. //重新添加错误提示语句
  21. constraintValidatorContext
  22. .buildConstraintViolationWithTemplate("字符串不能为空").addConstraintViolation();
  23. }
  24. return false;
  25. }
  26. }

使用的时候直接注解到对象的属性上面就可以了

 
  1. @CannotContainSpaces
  2. private String name;
 

测试当name包含空格的时候 entity.setName("xx xx");

 
 
当name为null的时候
 
 

整合Spring MVC

首先新增配置文件内容(实体类里面的注解与上面完全相同)
 
  1. <!-- 国际化配置 -->
  2. <bean id="localeResolver"
  3. class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
  4. <bean id="messageSource"
  5. class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  6. <property name="basenames">
  7. <list>
  8. <value>classpath:messages/messages</value>
  9. <value>classpath:messages/Validation</value>
  10. </list>
  11. </property>
  12. <property name="useCodeAsDefaultMessage" value="true" />
  13. </bean>
  14. <!-- 注册验证器 -->
  15. <mvc:annotation-driven validator="validator" />
  16. <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
  17. <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
  18. <!-- 这里配置将使用上面国际化配置的messageSource -->
  19. <property name="validationMessageSource" ref="messageSource"/>
  20. </bean>
 

在Spring MVC 控制器中方法属性如下

 
  1. /**
  2. * 这里的@Valid必须书写, bindingResult参数也必须书写在后面,否则验证不通过就会返回400
  3. * @param entity
  4. * @param result
  5. * @return
  6. */
  7. @RequestMapping(value="/valid")
  8. public String validator(@Valid Entity entity,BindingResult result){
  9. if(result.hasErrors()){
  10. //如果严重没有通过,跳转提示
  11. return "error";
  12. }else{
  13. //继续业务逻辑
  14. }
  15. return "success";
  16. }

error.jsp中如下

导入spring标签库
  1. <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
  1. <!-- commandName 控制器参数中对象名称 -->
  2. <form:form commandName="entity">
  3. <!-- 显示全部错误信息用* -->
  4. <form:errors path="*"/>
  5. </form:form>
  6. <hr/>
  7. <!-- 对象名称.属性名称    如果该对象的指定属性没有通过校验那么显示错误信息(根据当前语言显示不同国家的文字) -->
  8. <form:errors path="entity.name"/>

校验注解说明

  1. Bean Validation 中内置的 constraint
  2. @Null   被注释的元素必须为 null
  3. @NotNull    被注释的元素必须不为 null
  4. @AssertTrue     被注释的元素必须为 true
  5. @AssertFalse    被注释的元素必须为 false
  6. @Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  7. @Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  8. @DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  9. @DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  10. @Size(max=, min=)   被注释的元素的大小必须在指定的范围内
  11. @Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内
  12. @Past   被注释的元素必须是一个过去的日期
  13. @Future     被注释的元素必须是一个将来的日期
  14. @Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式
  15. Hibernate Validator 附加的 constraint
  16. @NotBlank(message =)   验证字符串非null,且长度必须大于0
  17. @Email  被注释的元素必须是电子邮箱地址
  18. @Length(min=,max=)  被注释的字符串的大小必须在指定的范围内
  19. @NotEmpty   被注释的字符串的必须非空
  20. @Range(min=,max=,message=)  被注释的元素必须在合适的范围内

注意

①:在整合Spring MVC的时候,ValidationMessages_zh_CN.properties文件如果不是放在src目录下(如上面放在src/messages/下面) 那么在属性文件里面不能使用动态参数获取了(如${length} ${max}这些). 必须将hibernate validation的国际化属性全部放到src目录下面才可以(不晓得为什么,如果你能解决顺便留个言)
 
②:我这里使用的是spring 4.1 + hibernate validation 5.1 ,如果你使用的是spring 3.2 需要对于的hibernate validation版本是 4.x的 不然在配置

  1. org.springframework.validation.beanvalidation.LocalValidatorFactoryBean

这个的是会报错,

Hibernate validator使用和自定义validator及整合Spring MVC的更多相关文章

  1. 【深度分析】:阿里,腾讯面试题 SpringBoot整合Spring MVC

    Java学习总结 SpringBoot整合Spring MVC 1.SpringMVC概述 MVC(Model–view–controller)是软件工程中的一种软件架构模式,基于此模式把软件系统分为 ...

  2. MyBatis整合Spring MVC

    前面几篇文章已经讲到了mybatis与spring 的集成.目前主流的Web MVC框架,除了Struts这个主力外,还有Spring MVC,主要是由于 Spring MVC 配置比较简单,使用起来 ...

  3. MyBatis整合Spring MVC(易百教程)

    MyBatis是ibatis的升级版,作为hibernate的老对手,它是一个可以自定义SQL.存储过程和高级映射的持久层框架.与Hibernate 的主要区别就是 Mybatis 是半自动化的,而 ...

  4. spring 整合 spring mvc

    需要进行 Spring 整合 SpringMVC 吗 ? 还是否需要再加入 Spring 的 IOC 容器 ? 是否需要再 web.xml 文件中配置启动 Spring IOC 容器的 Context ...

  5. UEditor1.4.3.3整合Spring MVC和七牛

    [前言] 项目中涉及将UEditor上传服务器整合进已有的基于Spring MVC的服务中,并且将上传到本地改为上传到七牛,看似简单的一个需求,实际做起来还是遇到了一些困难.在这里分享一下经验-- 七 ...

  6. patchca整合Spring MVC生成超炫的验证码

    转载:http://lavasoft.blog.51cto.com/62575/1406947 @Controller public class Login2Controller {     priv ...

  7. Intellij IDEA采用Maven+Spring MVC+Hibernate的架构搭建一个java web项目

    原文:Java web 项目搭建 Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring ...

  8. spring mvc和web-flow的整合方案

    发现了一份整合spring MVC 和webflow的很好的资料,日后翻译出来发布.先记着. http://docs.spring.io/spring-webflow/docs/2.3.x/refer ...

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

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

随机推荐

  1. Java - BlockingQueue

    https://juejin.im/post/5aeebd02518825672f19c546 https://www.infoq.cn/article/java-blocking-queue blo ...

  2. Js调试中不得不知的Console

    在js调试中,大部分的前端人员都是采用console.log()方法来打印出调试的数据,但是很多人都不知道console这个对象有很多很实在的方法,本文就来介绍一下这些方法的使用. 一.console ...

  3. 用JS来实现的第一个简单游戏 :贪吃蛇

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 2017-12-06 JavaScript实现ZLOGO子集: 单层循环功能

    前文JavaScript实现ZLOGO子集: 前进+转向的示例代码很累赘, 因此尝试实现基本的循环功能, 使得前面的11行代码缩减为7行: 开始 循环4次 前进200 左转144度 到此为止 前进20 ...

  5. numpy库的常用方法

    np.abs() 计算数组各元素的绝对值1 a= [0,1,2,3,4,-5,9,-3,12,-4] np.abs(a)out: array([ 0, 1, 2, 3, 4, 5, 9, 3, 12, ...

  6. SoapUI 访问代理设置

    SoapUI 访问代理设置 by:授客 QQ:1033553122 问题描述: 运行SoapUI时,发现接口访问不通,如下图,提示"Connection to http://127.0.0. ...

  7. off by null 实战

    前言 off by null 是一个比较有意思的技术 下面通过 hctf2018 的 heapstrom_zero 实战一波. 相关文件(exp, 题目)位于 https://gitee.com/ha ...

  8. 2.网络编程-udp

    # 使用套接字发送udp数据import socket s = socket.socket(socket.AF_INET, SOCK_DGRAM) s.sendto(b"hello" ...

  9. github版本控制相关

    Git版本控制: 安装Github http://blog.csdn.net/huangyuan_xuan/article/details/49125597 Git本地版本控制 http://blog ...

  10. SQL like 模糊查询, in

    ​ [{"互联网":["网络媒体","微博","墨迹天气","河北天气","其他" ...