JPA 2.0: Eccezione per utilizzare il pacchetto javax.validation. * In JPA 2.0

quando provo a utilizzare la convalida del bean con JPA usando la sospensione, si verificherà l’eccezione seguente:

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: Chapter11] Unable to build EntityManagerFactory at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) at example.test.Test.main(Test.java:18) Caused by: org.hibernate.HibernateException: Error applying BeanValidation relational constraints at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:219) at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:126) at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:306) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744) at org.hibernate.ejb.EntityManagerFactoryImpl.(EntityManagerFactoryImpl.java:94) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905) ... 5 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:208) ... 10 more Caused by: java.lang.NoClassDefFoundError: javax/validation/ParameterNameProvider at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:41) at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:269) at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111) at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:521) at org.hibernate.cfg.beanvalidation.TypeSafeActivator.applyDDL(TypeSafeActivator.java:119) ... 15 more Caused by: java.lang.ClassNotFoundException: javax.validation.ParameterNameProvider at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 20 more 

Sono nuovo per usare il pacchetto di convalida e non ho conoscenza dei bean JAVA EE. come utilizzare questo pacchetto di convalida con l’ quadro jpa che segue è il mio codice:

  public class Employee implements Serializable , EmployeeDetail{ private static final long serialVersionUID = 1L; @Id @GeneratedValue private int id; @NotNull private String name; ____________________ public class Test { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("Chapter11"); EntityManager em = emf.createEntityManager(); EntityTransaction etr = em.getTransaction(); etr.begin(); ------------------ FullTimeEmployee flEmp = new FullTimeEmployee(); flEmp.setName("Harmeet Singh"); flEmp.setPension(56000); flEmp.setSalary(100000); ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); validator.validate(flEmp, Employee.class); em.persist(flEmp); etr.commit(); 

Come @Korgen menzionato nei commenti, hibernate-validator-5.xx non è compatibile con validation-api-1.0.x . Questo è dovuto al passaggio alle nuove specifiche JSR-303 -> JSR-349.

Esistono due modi per risolvere questo problema:

1. Downgrade della versione di validazione di Hibernate (che è implementata con JSR-303):

  org.hibernate hibernate-validator 4.3.1.Final  

2. Se non si desidera tornare dal validatore di hibernate 5 a hibernate validator 4 un’altra soluzione è aggiornare javax.validation alla versione superiore (che descrive JSR-349):

  javax.validation validation-api 1.1.0.Final  

Per coloro che hanno ottenuto l’errore NoClassDefFoundError: javax/validation/valueextraction/ValueExtractorDeclarationException e il loro validation-api era già javax.validation:validation-api:1.1.0.Final

La correzione era l’aggiornamento da javax.validation:validation-api:1.1.0.Final a javax.validation:validation-api:2.0.1.Final .