web-dev-qa-db-ja.com

エラー:タイプ:Java.time.LocalDateのバリデーターが見つかりませんでした

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をサポートしていませんか?

11

実際に参照する問題は 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固有の機能になりました。

13
Hardy

@Pastjavax.validation.constraintsアノテーションがあります(validation-api-2.0.1.Final)

そしてそれはJava.time.LocalDateのためにかなりうまく機能します

2
Ruslan Sheremet

LocalDateはまだかなり新しいので、多くのライブラリはまだそれを処理していません。私が取り組んでいるプロジェクトでは、LocalDateのカスタムユーザータイプを作成する必要がありました。

この休止状態の問題を見てください HHH-8844

Java8の新しいDateAPIをサポートするために新しいモジュールhibernate-Java8が追加されたようです。

上記の情報が型マッピングについて話していることは知っていますが、検証にも同じことが当てはまる可能性があります。

すぐに使えるソリューションがない場合は、独自に作成する必要があるかもしれません。 joda時間バリデーターを追加する例については、次のページを参照してください。Java 8つの日付は類似している必要があります link

2
EricF