Hibernate Validation自定义验证规则

缺乏、安全感 2022-05-29 12:21 533阅读 0赞

一、简介

有时候在做项目的过程中会发现Hibernate Validation提供的验证规则并不能百分百的复合业务需要,就如,在插入数据库时要保证插入进去的某个属性的ID必须要唯一,不能重复插入,类似于表单不能重复提交,,在这个时候,我们就得扩展Validation来实现自己的业务,具体步骤如下:

1、首先定义一个注解

  1. import javax.validation.Constraint;
  2. import javax.validation.Payload;
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.Target;
  6. import static java.lang.annotation.ElementType.*;
  7. import static java.lang.annotation.RetentionPolicy.*;
  8. /**
  9. * @version V1.0
  10. * @Author fendo
  11. * @ClassName MobileCheck
  12. * @PackageName
  13. * @Description 数据插入ID唯一校验
  14. * @Data 2017-09-21 10:47
  15. **/
  16. @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
  17. @Retention(RUNTIME)
  18. //指定验证器
  19. @Constraint(validatedBy = CheckValidator.class)
  20. @Documented
  21. public @interface InsertCheck {
  22. //默认错误消息
  23. String message() default "{forbidden.word}";
  24. //查询的表名
  25. String tableName() default "";
  26. String cloumn() default "";
  27. String sql() default "";
  28. //分组
  29. Class<?>[] groups() default { };
  30. //负载
  31. Class<? extends Payload>[] payload() default { };
  32. //指定多个时使用
  33. @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
  34. @Retention(RUNTIME)
  35. @Documented
  36. @interface List {
  37. InsertCheck[] value();
  38. }
  39. }

2、定义一个类实现ConstraintValidator

  1. import com.gz.medicine.common.util.JuheUtil;
  2. import com.gz.medicine.common.util.RegexUtils;
  3. import com.gz.medicine.common.util.SimpleResult;
  4. import com.gz.medicine.common.util.TimeUtil;
  5. import com.gz.medicine.gzyun.health.mapper.HealthyOrderMapper;
  6. import org.apache.commons.collections.map.HashedMap;
  7. import org.apache.log4j.Logger;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import javax.validation.ConstraintValidator;
  10. import javax.validation.ConstraintValidatorContext;
  11. import java.lang.annotation.Annotation;
  12. import java.text.SimpleDateFormat;
  13. import java.util.Date;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.regex.Pattern;
  17. /**
  18. * @version V1.0
  19. * @Author fendo
  20. * @ClassName MobileCheck
  21. * @PackageName
  22. * @Description 扩展Validator
  23. * @Data 2017-09-21 10:47
  24. **/
  25. public class CheckValidator implements ConstraintValidator<Annotation, Object> {
  26. @Autowired
  27. HealthyOrderMapper healthyordermapper; //数据库操作Mapper
  28. public static final Logger LOGGER = Logger.getLogger(CheckValidator.class);
  29. public static final String DATE_CHECK ="((^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._])(10|12|0?[13578])([-\\/\\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._])(11|0?[469])([-\\/\\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._])(0?2)([-\\/\\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([3579][26]00)([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([1][89][0][48])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([2-9][0-9][0][48])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([1][89][2468][048])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([2-9][0-9][2468][048])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([1][89][13579][26])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([2-9][0-9][13579][26])([-\\/\\._])(0?2)([-\\/\\._])(29)$))";
  30. public static final String TIME_CHECK="^([0-1]?[0-9]|2[0-3]):([0-5][0-9])";
  31. public static final String YYYYMMHHDDMI="^(\\d{4})-(0\\d{1}|1[0-2])-(0\\d{1}|[12]\\d{1}|3[01]) (0\\d{1}|1\\d{1}|2[0-3]):([0-5]\\d{1})$";
  32. private String value;
  33. private int annotationType;
  34. @Override
  35. public void initialize(Annotation annotation) {
  36. if (annotation instanceof InsertCheck) {
  37. annotationType = 0;
  38. InsertCheck ak = (InsertCheck) annotation;
  39. this.value = ak.sql();
  40. }
  41. if (annotation instanceof DateCheck) {
  42. annotationType = 1;
  43. DateCheck dk = (DateCheck) annotation;
  44. this.value = dk.type();
  45. }
  46. if (annotation instanceof IdCardCheck) {
  47. annotationType = 2;
  48. IdCardCheck ik = (IdCardCheck) annotation;
  49. }
  50. if (annotation instanceof MobileCheck) {
  51. annotationType = 3;
  52. MobileCheck ik = (MobileCheck) annotation;
  53. }
  54. }
  55. public static void main(String[] args) {
  56. System.out.println(Pattern.matches("","2017-12-32 09:54"));
  57. }
  58. @Override
  59. public boolean isValid(Object ot, ConstraintValidatorContext constraintValidatorContext) {
  60. boolean re = false;
  61. try {
  62. switch (annotationType) {
  63. case 0: {
  64. try {
  65. String key = this.value.substring(this.value.indexOf("{") + 1, this.value.indexOf("}"));
  66. Map<String, Object> mp = new HashedMap();
  67. mp.put("sql", this.value);
  68. mp.put(key, ot);
  69. List<Map<String, Object>> li = healthyordermapper.exuSql(mp);
  70. System.out.println(li.size());
  71. if (li != null && li.size() == 0) {
  72. re = true;
  73. }
  74. } catch (Exception e) {
  75. e.printStackTrace();
  76. ;
  77. }
  78. break;
  79. }
  80. case 1: {
  81. try {
  82. if("YYYY-MM-DD".equals(this.value)){
  83. re =Pattern.matches(DATE_CHECK, (String) ot);
  84. }
  85. if("HH:MI".equals(this.value)){
  86. re =Pattern.matches(TIME_CHECK, (String) ot);
  87. }
  88. if("YYYY-MM-DD HH:MI".equals(this.value)){
  89. re =Pattern.matches(YYYYMMHHDDMI, (String) ot);
  90. }
  91. } catch (Exception e) {
  92. e.printStackTrace();
  93. ;
  94. }
  95. break;
  96. }
  97. case 2: {
  98. try {
  99. SimpleResult sr = JuheUtil.getIdcardMsg((String) ot);
  100. String code = (String) sr.get("code");
  101. if ("000".equals(code)) {
  102. re = true;
  103. }
  104. } catch (Exception e) {
  105. }
  106. break;
  107. }
  108. case 3:{
  109. re = RegexUtils.isMobile((String) ot);
  110. break;
  111. }
  112. }
  113. } catch (Exception e) {
  114. LOGGER.error("校验异常:" + e.getMessage(), e);
  115. }
  116. return re;
  117. }
  118. }

3、使用方式

  1. /**
  2. * 出生日期
  3. */
  4. @DateCheck(type="YYYY-MM-DD",message="请输入正确的出生日期!!!!")
  5. @NotEmpty(message="出生日期不能为空!")
  6. String usrbirth;
  7. /**
  8. * 手机号码
  9. */
  10. @NotEmpty(message="手机号码不能为空!")
  11. @MobileCheck(message="请输入正确的手机号!")
  12. String usrphone;

4、其他一些验证规则

4.1 时间验证

  1. import javax.validation.Constraint;
  2. import javax.validation.Payload;
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.Target;
  6. import static java.lang.annotation.ElementType.*;
  7. import static java.lang.annotation.RetentionPolicy.RUNTIME;
  8. /**
  9. * @version V1.0
  10. * @Author fendo
  11. * @ClassName MobileCheck
  12. * @PackageName
  13. * @Description 时间验证
  14. * @Data 2017-09-21 10:47
  15. **/
  16. @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
  17. @Retention(RUNTIME)
  18. //指定验证器
  19. @Constraint(validatedBy = CheckValidator.class)
  20. @Documented
  21. public @interface DateCheck {
  22. //默认错误消息
  23. String message() default "YYYY-MM-DD";
  24. //查询的表名
  25. String type() default "YYYY-MM-DD";
  26. //分组
  27. Class<?>[] groups() default { };
  28. //负载
  29. Class<? extends Payload>[] payload() default { };
  30. //指定多个时使用
  31. @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
  32. @Retention(RUNTIME)
  33. @Documented
  34. @interface List {
  35. DateCheck[] value();
  36. }
  37. }

4.2 身份证验证

  1. import javax.validation.Constraint;
  2. import javax.validation.Payload;
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.Target;
  6. import static java.lang.annotation.ElementType.*;
  7. import static java.lang.annotation.RetentionPolicy.RUNTIME;
  8. /**
  9. * @version V1.0
  10. * @Author fendo
  11. * @ClassName MobileCheck
  12. * @PackageName
  13. * @Description 身份证验证
  14. * @Data 2017-09-21 10:47
  15. **/
  16. @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
  17. @Retention(RUNTIME)
  18. //指定验证器
  19. @Constraint(validatedBy = CheckValidator.class)
  20. @Documented
  21. public @interface IdCardCheck {
  22. //默认错误消息
  23. String message() default "身份证格式错误.";
  24. //查询的表名
  25. //分组
  26. Class<?>[] groups() default { };
  27. //负载
  28. Class<? extends Payload>[] payload() default { };
  29. //指定多个时使用
  30. @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
  31. @Retention(RUNTIME)
  32. @Documented
  33. @interface List {
  34. IdCardCheck[] value();
  35. }
  36. }

4.3 手机号验证

  1. import javax.validation.Constraint;
  2. import javax.validation.Payload;
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.Target;
  6. import static java.lang.annotation.ElementType.*;
  7. import static java.lang.annotation.RetentionPolicy.RUNTIME;
  8. /**
  9. * @version V1.0
  10. * @Author fendo
  11. * @ClassName MobileCheck
  12. * @PackageName com.gz.medicine.gzyun.health.vaild
  13. * @Description 手机号校验
  14. * @Data 2017-09-21 10:47
  15. **/
  16. @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
  17. @Retention(RUNTIME)
  18. //指定验证器
  19. @Constraint(validatedBy = CheckValidator.class)
  20. @Documented
  21. public @interface MobileCheck {
  22. String message() default "手机号格式错误";
  23. Class<?>[] groups() default { };
  24. Class<? extends Payload>[] payload() default { };
  25. }

发表评论

表情:
评论列表 (有 0 条评论,533人围观)

还没有评论,来说两句吧...

相关阅读