JSR-349bean验证注释可以用来验证Java时间类型吗?
JavaBeanValidation1.1(JSR-349)定义了类似于JSR-349bean验证注释可以用来验证Java时间类型吗?,java,bean-validation,jsr349,Java,Bean Validation,Jsr349,JavaBeanValidation1.1(JSR-349)定义了类似于@Future和@pass的注释,用于验证时态类型,但它们只适用于Java.util.Date和Java.util.Calendar 我正在使用一个类型为java.time.LocalDate的字段,并希望它是在未来,但要这样做,我似乎必须编写自己的@future注释来支持这种类型,这是一个遗憾,因为@javax.validation.constraints.future在语义上是理想的 鉴于BV 1.1中现在提供的增强选项
@Future
和@pass
的注释,用于验证时态类型,但它们只适用于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>
com.acme.app.constraint.FutureValidatorForLocalDate
第节对此进行了解释。在浏览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>
com.acme.app.constraint.FutureValidatorForLocalDate
第节对此进行了解释。最终解决了这个问题。下面是自定义约束定义的Java版本
HibernateValidatorConfiguration conf = (HibernateValidatorConfiguration) Validation.byDefaultProvider().configure();
conf.addConstraintDefinitionContributor((constraintDefinitionContributionBuilder) -> {
constraintDefinitionContributionBuilder.constraint(Future.class)
.validatedBy(MyCustomFutureConstraintValidator.class)
.includeExistingValidators(true);
});
Validator validator = conf.buildValidatorFactory().getValidator();
终于弄明白了。下面是自定义约束定义的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关联的时区信息。由于这个原因,你无法判断它是在未来还是过去。另请参见-通过配置实例或XML提供的解决方案是正确的。LocalDate不能在开箱即用的情况下进行验证也是正确的。然而,我不同意@Future在语义上确实适合这种日期类型。只有在时间线上有一个实例的情况下,才能回答某件事是否在未来。LocalDate并非如此。Javadoc对此非常清楚。没有与LocalDate关联的时区信息。由于这个原因,你无法判断它是在未来还是过去。另见-谢谢,弗兰克。我应该说我希望有一个纯Java配置,但这将有望为我指明正确的方向。如果您使用Hibernate验证器实现,请查看HibernateValidator配置的流畅配置API。这是特定于提供程序的功能,与标准API不兼容。谢谢,我正在调查。我觉得
ConstraintDef
和ConstraintMapping
是最好的选择,但它不是最直观的API!有什么原因让你更喜欢添加非标准和非直观的代码而不是使用标准的XML吗?编译时验证、类型安全性、简洁性等等。支持Java配置而不是XML配置的通常原因,真的!非标准是我准备吞下的一种药丸,因为我实际上不打算为此从Hibernate验证器切换。不过,谢谢你的回答,这无疑为我指明了解决办法。谢谢,弗兰克。我应该说我希望有一个纯Java配置,但这将有望为我指明正确的方向。如果您使用Hibernate验证器实现,请查看HibernateValidator配置的流畅配置API。这是特定于提供程序的功能,与标准API不兼容。谢谢,我正在调查。我觉得ConstraintDef
和ConstraintMapping
是最好的选择,但它不是最直观的API!有什么原因让你更喜欢添加非标准和非直观的代码而不是使用标准的XML吗?编译时验证、类型安全性、简洁性等等。支持Java配置而不是XML配置的通常原因,真的!非标准是我准备吞下的一种药丸,因为我实际上不打算为此从Hibernate验证器切换。不过,谢谢你的回答,这无疑为我指明了解决方案。我可以看出你没有撒谎,简洁明了,我不会再投票了;-)哈哈!可以理解,不用担心!我可以看出你没有撒谎,简洁就在这里,不过我不打算再投票了;-)哈哈!可以理解,不用担心!