Errore durante l’avvio di Hibernate Validator a causa dell’API di convalida dei bean

Sto cercando di utilizzare Hibernate Validator nel mio progetto, ma non funziona. Sulla riga seguente:

SessionFactory sessions = config.buildSessionFactory(builder.build()); 

Ottengo la seguente eccezione:

 org.hibernate.cfg.beanvalidation.IntegrationException: Error activating Bean Validation integration at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:154) at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:311) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1857) at net.myProject.server.util.HibernateUtil.(HibernateUtil.java:32) ... 36 more Caused by: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider; at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.(ValidatorFactoryImpl.java:119) at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:45) at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:217) at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111) 

Ho trovato questa domanda che sembra abbastanza simile al mio problema. Descrive la sua soluzione come

Ho avuto ancora un altro jar validatore di bean nel percorso della class. Ma non da parte di Maven, quindi non me ne sono reso conto. Rimozione che ha risolto il problema.

Penso che il mio problema sia lo stesso. Su http://hibernate.org/validator/documentation/getting-started/ si dice:

In questo modo la dipendenza passa all’API di convalida del bean (javax.validation: validation-api: 1.1.0.Final)

Questo deve causare questo problema, poiché il ripristino di una versione precedente (4.3.1.Final) risolve il problema. C’è un modo per forzare Hibernate a non inserire l’API di convalida dei bean?

Modifica: ho provato a escludere l’API di convalida javax:

   org.hibernate hibernate-validator 5.0.3.Final   javax.validation validation-api    

Ma non sembrava avere alcun effetto.

Prova ad aggiungere questa dipendenza al tuo pom.xml

  javax.validation validation-api 1.0.0.GA  

Se non si considera l’utilizzo di hibernate-validator4.2.0.Final, ho quello nella mia configurazione e funziona correttamente.

Per me, la versione 1.1.0.Final aveva funzionato javax.validation.validation-api. Perché l’interfaccia javax.validation.spi.ConfigurationState di 1.1.0.Final ha il metodo getParameterNameProvider, che era assente in 1.0.0.GA.

Ho aggiunto la dipendenza sottostante in pom.xml

  javax.validation validation-api 1.1.0.Final test  

nel mio caso ho appena cancellato il validatore di ibernazione e ha funzionato. (Avevo anche una combinazione di API di validazione e validatore di ibernazione e ho provato tutto) oppure puoi andare al tuo repository di maven -> org e quindi eliminare la cartella di ibernazione e ricostruisci di nuovo il tuo progetto .. spero che aiuti ..

Ho pensato che sarebbe stato utile spiegare cosa sta succedendo qui.

Hibernate chiama ConfigurationState.getParameterNameProvider :

ValidatorFactoryImpl.java :

 public ValidatorFactoryImpl(ConfigurationState configurationState) { ... configurationState.getParameterNameProvider() ... } 

Puoi trovare la documentazione di getParameterNameProvider :

getParameterNameProvider

ParameterNameProvider getParameterNameProvider()

Restituisce il provider del nome parametro per questa configurazione.

Ritorna:

nome parametro provider instance o null se non definito

Da:

1.1

Allora, qual’è il problema? Il problema è che il metodo non è sempre esistito. È stato aggiunto in futuro.

E la regola quando si creano interfacce è che sono impostate in concreto: non si cambierà mai un’interfaccia. Invece il validatore JavaX ha cambiato l’interfaccia di ConfigurationState e ha aggiunto alcuni nuovi metodi nel corso degli anni.

Il codice di validazione java sta passando a Hiberate un’interfaccia obsoleta di ConfiguationState ; uno che non implementa le interfacce richieste.

È necessario assicurarsi che javax.validation.Validation.buildDefaultValidatorFactory sia aggiornato per supportare la versione 1.1.

Rimozione di questo jar javax.validation:validation-api:1.1.0.Final risolto il mio problema.

Assicurati di avere un solo jar di convalida. Se disponiamo di due vasi, potrebbero verificarsi conflitti con conseguente errore.