zoukankan      html  css  js  c++  java
  • 自定义Java Validator

    自定义Java Validator

    在项目中,针对汉字的长度计算,数据库和java的计算方式不一致,需要重新处理下java 的 Validator,使其满足项目

    建立自定义的 validator annotation

    @Target({METHOD, FIELD})
    @Retention(RUNTIME)
    @Documented
    @Constraint(validatedBy = SizeValidator.class)		// 对应的验证class
    public @interface DbSize {
    
        String message() default "{javax.validation.constraints.Size.message}";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        /**
         * @return size the element must be higher or equal to
         */
        int min() default 0;
    
        /**
         * @return size the element must be lower or equal to
         */
        int max() default Integer.MAX_VALUE;
    
    }
    
    

    创建验证的执行类

    public class DbSizeValidator implements ConstraintValidator<DbSize, String> {
    
        @Value("${db.charset:GBK}")
        private String charset;
    
        private DbSize size;
    
        @Override
        public void initialize(DbSize constraintAnnotation) {
            this.size = constraintAnnotation;
        }
    
        /**
         * Implements the validation logic.
         * The state of {@code value} must not be altered.
         * <p>
         * This method can be accessed concurrently, thread-safety must be ensured
         * by the implementation.
         *
         * @param value   object to validate
         * @param context context in which the constraint is evaluated
         * @return {@code false} if {@code value} does not pass the constraint
         */
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            if (value == null || "".equals(value)) {
                return size.min() == 0 ? true : false;
            }
            int length = 0;
            try {
                length = value.getBytes(charset).length;
            } catch (Exception e) {
                try {
                    length = value.getBytes(Charset.forName("GBK")).length;
                } catch (Exception e1){
                    // 如果失败,jvm就直接狗带了,不需要了
                    length = value.getBytes().length;
                }
            }
            return (length > size.max() || length < size.min()) ? false : true;
        }
    }
    

    测试

    public class DbSizeValidatorTest {
    
        @Test
        public void validatorTest() {
            ValidationModel model = new ValidationModel();
            ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
            Validator validator = validatorFactory.getValidator();
            Set<ConstraintViolation<ValidationModel>> validate = validator.validate(model);
            List<String> messageList = new ArrayList<>();
            for (ConstraintViolation<ValidationModel> constraintViolation : validate) {
                messageList.add(constraintViolation.getMessage());
            }
    
            Assertions.assertEquals(true, messageList.stream().map(el -> "请使用类型".equals(el)).count() == 1);
            messageList.stream().forEach(System.out::println);
        }
    
    
        @Data
        private class ValidationModel {
            @DbSize(max = 2, message = "请使用类型")
            private String xdoSize = "错误";
    
            @DbSize(max = 2, message = "xdoSize正确")
            private String xdoSize1 = "对";
    
            @DbSize(max = 5, message = "xdoSizeEn正确")
            private String xdoSize2 = "对aB2";
        }
    }
    
    
  • 相关阅读:
    麻省理工18年春软件构造课程阅读13“调试”
    麻省理工18年春软件构造课程阅读15“相等”
    麻省理工18年春软件构造课程阅读12“接口与枚举”
    麻省理工18年春软件构造课程阅读11“抽象函数与表示不变量”
    麻省理工18年春软件构造课程阅读10“抽象数据类型”
    麻省理工18年春软件构造课程阅读09“避免调试”
    麻省理工18年春软件构造课程阅读08“可变性与不变性”
    麻省理工18年春软件构造课程阅读07“设计规格说明”
    麻省理工18年春软件构造课程阅读06“规格说明”
    麻省理工18年春软件构造课程阅读05“版本控制”
  • 原文地址:https://www.cnblogs.com/warrior/p/10886456.html
Copyright © 2011-2022 走看看