如何在 spring 启动应用程序中重用验证器 class?

How to reuse validator class in spring boot app?

我目前正在为 Spring 启动应用程序编写自定义验证程序,其想法主要是根据其他验证进行一些验证。例如,如果其他字段为 null,我希望一个字段为 @NotNull,但我的想法是使其更通用,以便可以更改此条件验证。 为此,我尝试使用注释中的验证 类,这些注释已经存在,例如 @NotNull 或 @Size,但事实证明它们没有:

@Constraint(validatedBy = { })
public @interface NotNull {
}

validatedBy 后这些花括号是什么意思?如何获取该接口使用的Validator?

如果您创建自己的约束注释,则应使用 validatedBy 属性在 @Constraint 中定义验证器。

built-in constraint-annotations 的验证器在其构造函数的 ConstraintHelper class 中注册,因此大括号为空。例如,ConstraintHelper 构造函数中 @NotNull 注解的验证器注册看起来是这样的:

putConstraint( tmpConstraints, NotNull.class, NotNullValidator.class );

如果您想查看 javax.validation.ConstraintValidator 的 built-in 实现,请转到 org.hibernate.validator.internal.constraintvalidators 包。或者,如果您使用的是 Intellij Idea:

Right click on declaration of ConstraintValidator -> Go To -> Implementation(s)

因此,要重用此验证器,您可以创建自定义注释并在其上放置 built-in 个注释:

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@NotNull
@NotEmpty
@Constraint(validatedBy = { })
public @interface NotNullAndNotEmpty {
    String message() default "some message";
    Class<?>[] groups() default {};
    Class<? extends Payload> [] payload() default {};
}

,或者您可以在您的自定义验证器中初始化一些 built-in 验证器,然后在您的 isValid() 方法中调用它的 isValid() 方法。