JPA 2.0:在JPA 2.0中使用javax.validation.*包的异常情况

50

使用Hibernate进行JPA的Bean验证时,会出现以下异常:

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

我是第一次使用validation包,对JAVA EE beans也不了解。请问如何在JPA实体中使用这个validation包?以下是我的代码:

 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();

你正在使用哪个版本的应用服务器? - Korgen
目前没有使用应用服务器,使用核心Java实现JPA。 - Harmeet Singh Taara
你从哪个 jar 包中获取注解(例如 @NotNull)?你的类路径中是否有 JSR 303 实现(例如 Hibernate Validator)? - Korgen
1
我在我的类路径上有两个JAR文件,分别是1.validation-api-1.0.0.GA.jar和2.hibernate-validator-5.0.0.Alpha2.jar - Harmeet Singh Taara
7
Hibernate Validator 5实现了bean-validation 1.1(来源:http://planet.jboss.org/post/first_alpha_release_of_hibernate_validator_5)。 因此,这些Jars不适用于一起使用。 您需要使用Hibernate Validator 4。 - Korgen
2个回答

108

如@Korgen在评论中提到的, hibernate-validator-5.x.x validation-api-1.0.x 不兼容。 这是因为移动到新规范JSR-303 -> JSR-349。

有两种解决此问题的方法:

1. 降级Hibernate验证程序版本(实现JSR-303):

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.3.1.Final</version>
</dependency> 

2. 如果你不想从Hibernate Validator 5回退到Hibernate Validator 4,另一个解决方案是升级javax.validation到更高的版本(即JSR-349所描述的版本):

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

5
如果使用Maven构建项目,Hibernate Validator 5已经依赖了Validation API 1.1.0.Final。无需显式地添加它。 - Grigory Kislin
hibernate-validator 4.3.2.Final太兼容了。 - Stéphane B.

21

对于那些遇到错误 NoClassDefFoundError: javax/validation/valueextraction/ValueExtractorDeclarationException 并且他们的 validation-api 已经是 javax.validation:validation-api:1.1.0.Final 的人来说,解决方法是升级到 javax.validation:validation-api:2.0.1.Final


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接