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;
    }
}

 

 

posted @ 2022-03-31 14:56  荣超  阅读(173)  评论(0编辑  收藏  举报