繁体   English   中英

hibernate 验证器如何集成到 spring 引导启动器项目中

[英]How are hibernate Validators integrated into spring boot starter project

我经常对 spring 中的字段使用约束。 约束是标准的或自定义的

public  abstract class OrganizationEntity {
@Length(min = 1 , max = 256, message = "Organization name max length is 256 and min length is 1")
@NotNull(message = "Organization name should not be empty")
@Pattern(regexp = "^[a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9]$",message = "Organization name can contain Alphanumeric character and Hyphen in the middle")
public abstract String getName();
}

在导航到长度或模式注释时,我看到注释 org.hibernate.validator.constraints 的定义

    @Documented
@Constraint(
    validatedBy = {}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(List.class)
public @interface Length {
    int min() default 0;

    int max() default Integer.MAX_VALUE;

    String message() default "{org.hibernate.validator.constraints.Length.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface List {
        Length[] value();
    }
    }

我看到 validBy 留空,这意味着有些机制/库已经实现了这些检查。 哪个库提供这些实现? spring 如何管理此验证流程。

Hibernate 提供验证实现,并由 Spring 使用。

我可能过于简单化了,但据我了解 Spring 为 Spring 的应用程序上下文使用配置了 Hibernate 的ValidationFactory实现( ValidationFactoryImpl )和ValidatorExecutableValidator实现( ValidatorImpl ),为其他BindingResult组件公开它并将其转换为验证结果。

同时,Hibernate 的ValidatorImpl使用验证上下文,其中ConstraintValidator被注册为 map 与 package javax.validation.constraints不同的注解作为键,以及与 Hibernate 自己的约束,如@URL@ISBN . 这个 map 可以在ConstraintHelper class 中找到。

例如,您可以找到在那里注册的PatternValidator以验证带有@Pattern注释的值。

然后我们有下一个 Hibernate 验证流程(再次 - 简化):

  1. ValidatorImpl尝试验证某些内容并创建MetaConstraint (帮助 class 具有验证所需的所有信息);
  2. MetaConstraint为多个约束检查创建ConstraintTree
  3. ConstraintTree调用ConstraintValidatorManager及其getInitializedValidator方法,该方法从前面提到的 map 返回特定注释所需的ConstraintValidator

因此,Spring 使用的验证框架已经知道哪些ConstraintValidator实例用于特定的验证注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM