Bean Validation(Hibernate Validator 5.1.3.Final)を使用するプロジェクトに取り組んでいます。私のBeanには、@Past
アノテーションが付いた属性があります。
@Past(message = "A data deve estar no passado.")
private LocalDate dataAbertura;
ただし、検証が発生すると、次の例外が発生します。
21:46:12,424 ERROR [io.undertow.request] (default task-35) UT005023: Exception handling request to /financeiro/clientes/pessoafisica: javax.servlet.ServletException: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: Java.time.LocalDate.
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.Java:127) [vraptor-4.1.4.jar:]
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.Java:60) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.Java:132) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.Java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.Java:61) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.Java:36) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.Java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.Java:131) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.Java:56) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.Java:45) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.Java:63) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.Java:58) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.Java:70) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.Java:76) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.Java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.Java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.Java:261) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.Java:247) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.Java:76) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.Java:166) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.Java:197) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.Java:759) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142) [rt.jar:1.8.0_25]
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617) [rt.jar:1.8.0_25]
at Java.lang.Thread.run(Thread.Java:745) [rt.jar:1.8.0_25]
Caused by: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: Java.time.LocalDate.
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.verifyResolveWasUnique(ConstraintValidatorManager.Java:218) [hibernate-validator-5.1.3.Final.jar:5.1.3.Final]
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.findMatchingValidatorClass(ConstraintValidatorManager.Java:193) [hibernate-validator-5.1.3.Final.jar:5.1.3.Final]
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.getInitializedValidator(ConstraintValidatorManager.Java:97) [hibernate-validator-5.1.3.Final.jar:5.1.3.Final]
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.Java:125) [hibernate-validator-5.1.3.Final.jar:5.1.3.Final]
どうしましたか? Hibernate ValidatorはLocalDateをサポートしていませんか?
実際に参照する問題は HV-874 です。 Hibernate Validator 5.2.xは、いくつかの新しいJava 8の日付/時刻タイプのサポートを追加します。このコンテキストでは「いくつか」を強調する必要があります。特に、LocalDate
はサポートされていません。 。LocalDate
のJavadocは次のように述べています。
このクラスは、時間またはタイムゾーンを格納または表しません。代わりに、誕生日に使用される日付の説明です。オフセットやタイムゾーンなどの追加情報がないと、タイムライン上の瞬間を表すことはできません。
タイムラインにインスタントがないと、特定の日付が一部であるか将来であるかを判断することはできません。まず、タイムゾーンを添付することで、この質問を述べて回答することができます。
ユースケースでPast
と@Future
の制約をLocalDate
に使用することが理にかなっていると思われる場合は、いつでもConstraintValidator
に独自のLocalDate
を実装できます。 var] _そして、次のように制約マッピングファイルのconstraint-definition
要素を使用してXML経由で登録します ここ 。
Hibernate Validator 5.2を使用している場合は、Java ServiceLoaderアプローチを使用して追加のConstraintValidator
実装を登録することもできます- ConstraintDefinitionContributor を参照してください。後者はHibernateValidator固有の機能になりました。
@Past
にjavax.validation.constraints
アノテーションがあります(validation-api-2.0.1.Final)
そしてそれはJava.time.LocalDate
のためにかなりうまく機能します
LocalDateはまだかなり新しいので、多くのライブラリはまだそれを処理していません。私が取り組んでいるプロジェクトでは、LocalDateのカスタムユーザータイプを作成する必要がありました。
この休止状態の問題を見てください HHH-8844
Java8の新しいDateAPIをサポートするために新しいモジュールhibernate-Java8が追加されたようです。
上記の情報が型マッピングについて話していることは知っていますが、検証にも同じことが当てはまる可能性があります。
すぐに使えるソリューションがない場合は、独自に作成する必要があるかもしれません。 joda時間バリデーターを追加する例については、次のページを参照してください。Java 8つの日付は類似している必要があります link