• springboot validator校验


    引入jar包

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

    声明验证策略

    // 执行插入时的策略
    public interface ValidInsert {
    ​
    }
    ​
    // 执行修改时的策略   Default 是默认策略
    public interface ValidUpdate extends Default {
    ​
    }

    实体类添加校验注释

    class MyTest {
        private String id;
        @NotBlank(groups = {ValidInsert.class})
        @Length(groups = {ValidInsert.class}, min = 2, max = 50)
        private String name;
        @NotNull(groups = {ValidInsert.class})
        private Date cat;
        @NotNull(groups = {ValidInsert.class, ValidUpdate.class})
        private Date uat;
    }

    自定义校// 自定义的校验类

    // 自定义的校验类
    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    /*
    @Repeatable的使用有以下几个要点:
            在需要重复使用的注解上修饰 @Repeatable
            @Repeatable中的参数为被修饰注解的容器的类对象(class对象)
            容器包含一个value方法,返回一个被修饰注解的数组
     */
    @Repeatable(NotBlankZero.Values.class)
    @Constraint(validatedBy = {NotBlankZeroValidator.class})
    public @interface NotBlankZero {
    
        String message() default "不能为null、空串和不能等于0";
    
        // 哪些校验策略才执行校验
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        
        @interface Values {
            NotBlankZero[] value();
        }
    
    }
    
    // 校验实际干活的类
    public class NotBlankZeroValidator implements ConstraintValidator<NotBlankZero, Object> {
    
        private NotBlankZero constraintAnnotation;
    
        @Override
        public void initialize(NotBlankZero constraintAnnotation) {
            this.constraintAnnotation = constraintAnnotation;
        }
    
        @Override
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            System.out.println(constraintAnnotation);
            if (value == null) return false;
            if (value instanceof String) {
                if (((String) value).length() == 0) return false;
                return !"0".equals(value);
            } else if (value instanceof Long) {
                return !((long) value == 0);
            } else if (value instanceof Integer) {
                return !((int) value == 0);
            } else if (value instanceof Double) {
                return !((double) value == 0);
            } else if (value instanceof Float) {
                return !((float) value == 0);
            }
            return true;
        }
    }
     

    校验使用

    我这里是在业务层添加的 在控制器层添加也可以

    @Service
    @Validated //这里必须有  光方法上面添加无效
    class TestService{
        
        @Validated(ValidInsert.class)
        // 注意这里 @Valid 不添加的话无法校验里面的字段
        public void add(@NotNull @Valid MyTest test) {
            
        }
        
        // NotBlankZero是自定义注解
        @Validated({ValidUpdate.class})
        public void update(@NotBlankZero String id, @NotNull MyTest test) {
            
        }
        
    }

    这样就可以使用 但是默认是所有错误都校验完成后,一起返回错误信息

    我们可以配置只要出现一个错误就直接返回错误,不在往下校验

    添加配置

    @Configuration
    public class ValidConfig {
    ​
        @Bean
        public Validator validator() {
            // 配置出现错误就返回  默认全部校验完才返回错误
            ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                    .configure()
                    .addProperty(HibernateValidatorConfiguration.FAIL_FAST, "true")
                    .buildValidatorFactory();
            return validatorFactory.getValidator();
        }
    ​
        @Bean
        public MethodValidationPostProcessor methodValidationPostProcessor(Validator validator) {
            MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
            methodValidationPostProcessor.setValidator(validator);
            return methodValidationPostProcessor;
        }
    }

     

  • 相关阅读:
    分享一个难得的YiBo微博客户端应用源码Android版
    js的cookie操作及知识点详解
    c#中out参数的作用
    取消安卓listview,scrollview,gridview滑动时候边缘模糊问题
    分块+deque维护 Codeforces Round #260 (Div. 1) D. Serega and Fun
    并发
    感想
    windows服务器允许MySQL远程连接
    C. Vasya And The Mushrooms
    cf1017 D. The Wu
  • 原文地址:https://www.cnblogs.com/rchao/p/16081859.html
Copyright © 2020-2023  润新知