web-dev-qa-db-fra.com

JPA 2.0: exception pour utiliser le package javax.validation. * Dans JPA 2.0

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();
42
Harmeet Singh Taara

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>
100
Maxim Kolesnikov

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.

13
Jan Mares