经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Hibernate » 查看文章
Hibernate Validation自定义注解校验的实现
来源:jb51  时间:2019/4/16 10:22:14  对本文有异议

情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validation没有可用于上述需求的注解,故自定义一个注解并自定义校验规则。

自定义注解进行校验的步骤

  • 写一个校验注解,在注解中指定校验器类,校验注解与校验器一般一一对应。
  • 写一个校验器类并在校验器类中写校验逻辑,校验器必须实现ConstraintValidator<?, ?>接口,第一个参数是对应的注解,第二个参数是要校验的属性的类型

代码示例

校验注解

  1. package com.kunlun.validation.annotation;
  2.  
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.ElementType;
  5. import java.lang.annotation.Retention;
  6. import java.lang.annotation.RetentionPolicy;
  7. import java.lang.annotation.Target;
  8.  
  9. import javax.validation.Constraint;
  10. import javax.validation.Payload;
  11.  
  12. import com.kunlun.validation.validator.KlPatternValidator;
  13.  
  14. /**
  15. * 自定义的校验注解
  16. * 规则:
  17. * 1.如果字符串为空串或者为null,则不进行正则校验
  18. * 2.如果字符串不为空串,则必须进行正则校验
  19. * @author xc
  20. * @date 2018年1月19日上午11:38:02
  21. */
  22. @Documented
  23. // 指定该注解可以使用的地方
  24. @Target(value= {ElementType.FIELD})
  25. @Retention(RetentionPolicy.RUNTIME)
  26. // 指定实际进行校验的校验器,该校验器是自己写的且必须实现ConstraintValidator接口
  27. @Constraint(validatedBy=KlPatternValidator.class)
  28. public @interface KlPattern {
  29. /*
  30. * 用于验证的注解下列这三个方法必须要,这是Hibernate Validation框架要求的,否则程序再在调用的时候会报错
  31. * default用于对属性给定默认值
  32. * 如果不给定默认值,则在使用注解的时候必须给属性指定属性值,否则报错
  33. * 给定默认值时,在使用注解的时候可以不用指定属性值
  34. */
  35. String message() default "不符合正则!";
  36.  
  37. Class<?>[] groups() default {};
  38.  
  39. Class<? extends Payload>[] payload() default {};
  40.  
  41. // 没加default给定默认值,使用注解的时候该属性必须赋值,否则报错
  42. String regex();
  43. // value属性,加上了default "mercy" 使得该属性在使用注解的时候可以不用输入也不会报错
  44. String value() default "mercy";
  45. }

与上面校验注解对应的校验器类

  1. package com.kunlun.validation.validator;
  2. import javax.validation.ConstraintValidator;
  3. import javax.validation.ConstraintValidatorContext;
  4.  
  5. import com.kunlun.validation.annotation.KlPattern;
  6.  
  7. /**
  8. * KlPatternValidator是KlPattern注解实际调用的验证器
  9. * 在KlPatternValidator中完成校验逻辑
  10. *
  11. * @author xc
  12. * @date 2018年1月19日上午11:44:38
  13. */
  14. public class KlPatternValidator implements ConstraintValidator<KlPattern, String> {
  15.  
  16. private String regex;
  17.  
  18. /**
  19. * 通过initialize()可以获取注解里的属性值
  20. */
  21. @Override
  22. public void initialize(KlPattern constraintAnnotation) {
  23. ConstraintValidator.super.initialize(constraintAnnotation);
  24. regex = constraintAnnotation.regex();
  25. }
  26.  
  27. /**
  28. * 实际验证逻辑
  29. * 返回值为true表示验证通过,
  30. * 返回值为false表示验证未通过
  31. */
  32. @Override
  33. public boolean isValid(String s, ConstraintValidatorContext ctx) {
  34.  
  35. // 当前前端传过来的请求参数是空串,或者没传的时候,不进行后续正则校验
  36. if ("".equals(s) || s == null) {
  37. return true;
  38. }
  39.  
  40. // 进行正则校验
  41. if(s.matches(regex)) {
  42. return true;
  43. }
  44.  
  45. return false;
  46. }
  47. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号