我正在尝试运行dbtest但是我收到以下错误:
"引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[root-context.xml]中定义名称为'entityManagerFactory'的bean创建错误:init方法的调用失败;嵌套异常是java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax /持久/ ValidationMode;"
因此,我也得到以下错误:
"引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[root-context.xml]中定义创建名为'personRepository'的bean时出错:bean的初始化失败;嵌套异常是org.springframework.beans.factory .BeanCreationException:在类路径资源[root-context.xml]中定义名称为'entityManagerFactory'的bean时出错:init方法的调用失败;嵌套异常是java.lang.AbstractMethodError:org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo .getValidationMode()Ljavax /持久/ ValidationMode;
所以我们必须对我的root-context文件进行监视,它看起来如下:
而persisence.xml
看起来如下:
org.hibernate.ejb.HibernatePersistence
这是我的pom.xml文件:
4.0.0 se.lowdin civilforsvaret civilforsvaret-webbapp war 1.0.0-BUILD-SNAPSHOT 1.6 3.1.1.RELEASE 1.6.10 1.6.6 org.springframework spring-context ${org.springframework-version} commons-logging commons-logging org.springframework spring-webmvc ${org.springframework-version} org.aspectj aspectjrt ${org.aspectj-version} mysql mysql-connector-java 5.1.24 org.slf4j slf4j-api ${org.slf4j-version} org.slf4j jcl-over-slf4j ${org.slf4j-version} runtime org.slf4j slf4j-log4j12 ${org.slf4j-version} runtime log4j log4j 1.2.15 javax.mail javax.jms jms com.sun.jdmk jmxtools com.sun.jmx jmxri runtime javax.inject javax.inject 1 javax.servlet servlet-api 2.5 provided javax.servlet.jsp jsp-api 2.1 provided javax.servlet jstl 1.2 junit junit 4.7 test org.easymock easymock 3.1 org.hibernate hibernate-entitymanager 4.3.0.CR1 com.h2database h2 1.3.174 org.springframework spring-test 3.2.5.RELEASE org.springframework spring-jpa 2.0.8 org.springframework spring-jdbc 3.2.5.RELEASE org.springframework.data spring-data-jpa 1.4.2.RELEASE org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final maven-eclipse-plugin 2.9 org.springframework.ide.eclipse.core.springnature org.springframework.ide.eclipse.core.springbuilder true true org.apache.maven.plugins maven-compiler-plugin 2.5.1 1.6 -Xlint:all true true org.codehaus.mojo exec-maven-plugin 1.2.1 org.test.int1.Main
我是Spring MVC的完整菜鸟,无法找到问题所在.
这听起来像是ClassLoader冲突.我敢打赌你在类路径上有javax.persistence api 1.x,而Spring正试图访问ValidationMode
,这只是在JPA 2.0中引入的.
既然你使用Maven,那么mvn dependency:tree
找到工件:
<dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> </dependency>
并从您的设置中删除它.(请参阅排除依赖项)
AFAIK没有JPA 2的这种通用发行版,但你可以使用这个特定于Hibernate的版本:
<dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> </dependency>
好吧,因为那不起作用,你似乎仍然在那里有一些JPA-1版本.在测试方法中,添加以下代码:
System.out.println(EntityManager.class.getProtectionDomain() .getCodeSource() .getLocation());
看看它指向你的地方并摆脱那件神器.
啊,现在我终于看到了问题.摆脱这个:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jpa</artifactId> <version>2.0.8</version> </dependency>
并替换它
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.5.RELEASE</version> </dependency>
另外,您应该将所有测试库(spring-test,easymock等)设置为
<scope>test</scope>