可以使用 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.Date
和 java.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/
Java Bean Validation 1.1 (JSR-349) 定义了像 @Future
和 @Past
这样的注释来验证时间类型,但它们只适用于 java.util.Date
和 java.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/