目 录CONTENT

文章目录

Java数据校验框架

Jinty
2024-08-16 / 0 评论 / 0 点赞 / 20 阅读 / 5225 字

JSR / Bean Valiadation 与 Hibernate Validation、Spring Valiadation

  • JSR规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,位于javax.validation.constraints包下,只提供规范不提供实现。

  • 而hibernate validation是对这个规范的实践,提供相应的实现,并增加一些其他校验注解,如@Email,@Length,@Range等等,位于org.hibernate.validator.constraints包下。

  • spring对hibernate validation进行二次封装,显示校验validated bean时,可以使用spring validation或hibernate validation;

    • 而spring validation另一特性:便是其在springmvc模块中添加自动校验,并将校验信息封装进特定的类中。

@Valid和@Validated 区别

Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种)。

javax提供了@Valid,配合BindingResult可以直接提供参数验证结果(标准JSR-303规范)。

@Validated对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同

  • 分组

@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。

@Valid:没有分组校验的功能。

  • 注解作用域

@Validated:用在类型、方法和方法参数上(类, 方法, 参数)。但不能用于成员属性。

@Valid:可以用在方法、构造函数、方法参数和成员属性上(方法, 构造器, 参数,字段, 泛型),可以用@Valid实现嵌套验证

BindingResult

BindingResult用在实体类校验信息返回结果绑定。

该类作为方法入参,要写在实体对象后面。

 
@PostMapping("/menus")
public Result addMenu(@RequestBody @Valid Menu menu, BindingResult result) {}

Spring Boot 校验注解应用

配置

@Configuration
public class ValidatorConfig {
    // 遇到第一个错误后立即返回,而不是遍历完全部错误
    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                .addProperty("hibernate.validator.fail_fast", "true") //快速验证模式,有第一个参数不满足条件直接返回
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }
 
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
        postProcessor.setValidator(validator());
        return postProcessor;
    }
}
————————————————

自定义参数格式校验

校验注解定义

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.FIELD})
@Constraint(validatedBy = VersionValidator.class)
public @interface VersionValid {
    // 自行定义的值
    String[] values();
    // 错误信息
    String message() default "版本号无效";
    // 分组验证
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

@Constraint

用于处理验证逻辑,根据根据自己的业务需求来完成验证的逻辑。

校验处理器实现

public class VersionValidator implements ConstraintValidator<VersionValid,Object> {
 
    private String[] values;
    // 初始化方法
    @Override
    public void initialize(VersionValid versionValidator) {
        this.values = versionValidator.values();
    }
    // 验证的逻辑方法,返回true,则验证通过,否则则不通过。
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
        Boolean isFlag = false;
        for (int i = 0; i < values.length; i++){
            // 存在一致就跳出循环
            if (values[i] .equals(value)){
                isFlag = true; 
                break;
            }
        }
        return isFlag;
    }
}

ConstraintValidator接口

校验逻辑接口:有两个泛型,第一个是自定义的注解类,第二个就是要验证的数据的类型

使用及校验异常处理

自定义数据权限校验注解

可按上述完成数据权限校验注解的实现

参考资料

0

评论区