簡體   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