lorsque j'essaie d'utiliser la validation de bean avec JPA en utilisant hibernate, l'exception suivante se produit:
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.<init>(SessionFactoryImpl.Java:306)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1744)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(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
je suis nouveau pour utiliser le package de validation et je ne connais pas Java EE beans. comment utiliser ce package de validation avec l'entité jpa suivant est mon code:
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();
Comme @Korgen l'a mentionné dans les commentaires hibernate-validator-5.xx n'est pas compatible avec validation-api-1.0 .x . Cela est dû au passage à la nouvelle spécification JSR-303 -> JSR-349.
Il existe deux façons de résoudre ce problème:
1. Rétrogradez la version du validateur d'hibernation (qui implémente JSR-303):
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
2. Si vous ne voulez pas revenir du validateur d'hibernation 5 au validateur d'hibernation 4, une autre solution consiste à mettre à niveau javax.validation vers une version supérieure (qui est la description de JSR-349):
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
Pour ceux qui ont eu une erreur NoClassDefFoundError: javax/validation/valueextraction/ValueExtractorDeclarationException
et leur API de validation était déjà javax.validation:validation-api:1.1.0.Final
Le correctif consistait à mettre à niveau à partir de javax.validation:validation-api:1.1.0.Final
à javax.validation:validation-api:2.0.1.Final
.