可以使用 JSR-349 Bean 验证注释来验证 Java 时间类型吗?

Can JSR-349 Bean Validation Annotations be Used to Validate Java Time Types?

Java Bean Validation 1.1 (JSR-349) 定义了像 @Future@Past 这样的注释来验证时间类型,但它们只适用于 java.util.Datejava.util.Calendar开箱即用。

我正在使用一个类型为 java.time.LocalDate 的字段,并希望强制它在未来,但要这样做,我似乎必须编写自己的 @Future 注释支持这种类型,这是一种耻辱,因为 @javax.validation.constraints.Future 在语义上是理想的。

鉴于 BV 1.1 中现在可用的增强选项,是否可以将验证器配置为使用现有的 @javax.validation.constraints.Future 注释和支持新 Java 的自定义 ConstraintValidator时间 类?

编辑

理想情况下,我希望完全在 Java 代码中完成此操作,而无需编写任何 XML。虽然下面建议的基于 XML 的解决方案是可以接受的,但如果可以的话,我宁愿不使用 XML。

在查看 XML 部署描述符 (validation.xml) 时,您可以这样做:

<constraint-definition annotation="javax.validation.constraints.Future">
        <validated-by include-existing-validators="true">
            <value>com.acme.app.constraint.FutureValidatorForLocalDate</value>
        </validated-by>
</constraint-definition>

这在 8.1.2 of the specification 节中有解释。

终于明白了。这是自定义约束定义的 Java 版本。

HibernateValidatorConfiguration conf = (HibernateValidatorConfiguration) Validation.byDefaultProvider().configure();
conf.addConstraintDefinitionContributor((constraintDefinitionContributionBuilder) -> {
    constraintDefinitionContributionBuilder.constraint(Future.class)
            .validatedBy(MyCustomFutureConstraintValidator.class)
            .includeExistingValidators(true);
});
Validator validator = conf.buildValidatorFactory().getValidator();

通过配置实例或通过XML提供的解决方案是正确的。 LocalDate 不能开箱即用地验证也是正确的。但是,我不同意 @Future 在语义上确实是这种日期类型的理想选择。只有在时间轴上有实例的情况下才能回答未来是否存在。 LocalDate 不是这种情况。 Javadoc 对此非常清楚。没有与 LocalDate 关联的时区信息。出于这个原因,你无法判断它是在未来还是在过去。另见 - http://in.relation.to/2015/07/30/hibernate-validator-521-final/