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. 移动端meta整理

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  2. lfs(systemd版本)学习笔记-第3页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemd)学习笔记-第2页 的地址:https://www.cnblogs.com/renren-study-no ...

  3. vue.js 键盘enter事件的使用

    在监听键盘事件时,我们经常需要检查常见的键值.Vue 允许为 v-on 在监听键盘事件时添加按键修饰符: <!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -- ...

  4. Android SDK Manager无法更新的解决方案

    Android SDK Manager -> Tools -> Options HTTP Proxy Server:mirrors.neusoft.edu.cn HTTP Proxy Po ...

  5. Android滑动菜单使用(MenuDrawer和SlidingMenu)

    项目地址: https://github.com/gokhanakkurt/android-menudrawer   https://github.com/jfeinstein10/SlidingMe ...

  6. Azure Ubuntu18.04安装lxde桌面记录,Windows远程连接Ubuntu18.04(Linux)

    执行如下命令: 尽量按以下顺序执行,否则可能会发生意向不到的问题(坑) 1.更新数据源 sudo apt-get update 2.更新安装包 sudo apt-get upgrade 3.安装lxd ...

  7. JavaScript大杂烩3 - 理解JavaScript对象的封装性

    JavaScript是面向对象的 JavaScript是一种基于对象的语言,你遇到的所有东西,包括字符串,数字,数组,函数等等,都是对象. 面向过程还是面向对象? JavaScript同时兼有的面向过 ...

  8. sass @function,@for,@mixin 的应用

    项目前提: 不同的汽车显示不同的图片,一共9种汽车:每种汽车显示不同状态的图片,一共6种状态,所以一共会有54张图片 后台接口返回汽车种类分别为:1-9,汽车状态分别为:0-5 项目需求: 根据后台返 ...

  9. [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt

    [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt --//简单探究12c TABLE ACCESS BY INDEX ROWID BATCH ...

  10. [20171106]配置客户端连接注意.txt

    [20171106]配置客户端连接注意.txt --//在配置客户端连接时一般建议使用Net Manager工具,windows下调用执行Net Manager.--//linux下执行 netmgr ...