Hibernate validator使用和自定义validator及整合Spring MVC

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标签库
<%@ 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"/>

校验注解说明

Bean Validation 中内置的 constraint   
@Null   被注释的元素必须为 null   
@NotNull    被注释的元素必须不为 null   
@AssertTrue     被注释的元素必须为 true   
@AssertFalse    被注释的元素必须为 false   
@Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值   
@Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值   
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值   
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值   
@Size(max=, min=)   被注释的元素的大小必须在指定的范围内   
@Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内   
@Past   被注释的元素必须是一个过去的日期   
@Future     被注释的元素必须是一个将来的日期   
@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式   
Hibernate Validator 附加的 constraint   
@NotBlank(message =)   验证字符串非null,且长度必须大于0   
@Email  被注释的元素必须是电子邮箱地址   
@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内   
@NotEmpty   被注释的字符串的必须非空   
@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的 不然在配置
org.springframework.validation.beanvalidation.LocalValidatorFactoryBean
这个的是会报错,

猜你喜欢

转载自blog.csdn.net/yamaxifeng_132/article/details/80901596
今日推荐