如果@Constraint(通过= {}验证),则使用Hibernate验证程序来验证约束


问题内容

我有一个使用hibernate验证器进行验证的Spring
Web应用程序。我有位于不同项目中的约束注释。在我的spring项目中,我需要针对这些约束的验证器,因为我需要一些服务来执行验证。这样的情况是:我不能将约束验证器放在@Constraint(validatedBy
=
MyConstraintValidator.class)中,因为验证器在另一个项目中,我无法添加依赖项,因为这会创建循环依赖项,而这不是我们的方式想要它。我注意到javax.constraints没有指定验证器,它只是@Constraint(validatedBy
= {})。但是hibernate验证器仍然知道如何验证它们。有没有办法告诉我的hibernate验证器如何验证约束,而不必在约束中指定constaint-validators?

我希望能够验证此约束:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Constraint(validatedBy = {})
public @interface OneOf {

    String message() default "{OneOf}";

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

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

谢谢!


问题答案:

javax.validation.constraints验证器留给实现。Hibernate为这些约束提供验证器,并在引导时注册它们。

您可以通过XML设置验证器,而无需使用@Constraint(validatedBy = { })。但是,这通常用于添加/替换您自己提供的验证器。我不确定它会如何帮助您,因为您仍然需要引用约束验证器。

使用XML约束定义的示例:

<constraint-definition annotation="org.mycompany.CheckCase">
    <validated-by include-existing-validators="false">
        <value>org.mycompany.CheckCaseValidator</value>
    </validated-by>
</constraint-definition>

请参阅:通过XML配置

即将发布的5.2版本提供了更多方式,例如使用服务加载程序或实现ConstraintDefinitionContributor。请参阅:提供约束定义