我试图运行一个dbtest,但是我得到以下错误: lockquote
引起:org.springframework.beans.factory .BeanCreationException:在类中定义名为'entityManagerFactory'的bean时出错path资源[root-context.xml]:调用init方法失败; 嵌套异常是java.lang.AbstractMethodError : org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax / persistence / ValidationMode;
因为这样我也得到了以下错误: lockquote
引起的:org.springframework.beans.factory.BeanCreationException:在类路径中定义名称为'personRepository'的bean时出错 resource [root-context.xml]:初始化bean失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:使用名称'entityManagerF创建bean时出错在类中定义的'actory'路径资源[root-context.xml]:调用init方法失败; 嵌套异常是java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax / persistence / ValidationMode;
因此,我们必须熟悉我的根环境文件,它看起来如下:
<?xml version =1.0encoding =UTF-8?> < beans xmlns =www.springframework/schema/beans xmlns:xsi =www.w3/2001/XMLSchema-instance xsi:schemaLocation =www.springframework/schema/beans www.springframework/schema/beans/spring-beans.xsd\"> <! - Root Context:定义所有其他Web组件可见的共享资源这是我的pom.xml文件:
<?xml version =1.0encoding =UTF-8?> < project xmlns =maven.apache/POM/4.0.0xmlns:xsi =www.w3/2001/XMLSchema-instance xsi:schemaLocation =maven.apache/POM/4.0.0 maven.apache/maven-v4_0_0.xsd\"> < modelVersion> 4.0.0< / modelVersion> < groupId> se.lowdin< / groupId> < artifactId> civilforsvaret< / artifactId> < name> civilforsvaret-webbapp< / name> <包装>战争< / packaging> < version> 1.0.0-BUILD-SNAPSHOT< / version> <属性> < java-version> 1.6< / java-version> < org.springframework-version> 3.1.1.RELEASE< /org.springframework-version> < org.aspectj-version> 1.6.10< /org.aspectj-version> < org.slf4j-version> 1.6.6< /org.slf4j-version> < / properties> <依赖关系> <! - Spring - > < dependency> < groupId> org.springframework< / groupId> < artifactId> spring-context< / artifactId> < version> $ {org.springframework-version}< / version> <排除项> <! - 排除Commons记录SLF4j - > <排除> < groupId> commons-logging< / groupId> < artifactId> commons-logging< / artifactId> < /排除> < /排除> < /依赖关系> < dependency> < groupId> org.springframework< / groupId> < artifactId> spring-webmvc< / artifactId> < version> $ {org.springframework-version}< / version> < /依赖关系> <! - AspectJ - > < dependency> < groupId> org.aspectj< / groupId> < artifactId> aspectjrt< / artifactId> < version> $ {org.aspectj-version}< / version> < /依赖关系> <! - MySql连接 - > < dependency> < groupId> mysql< / groupId> < artifactId> mysql-connector-java< / artifactId> < version> 5.1.24< / version> < /依赖关系> <! - 记录 - > < dependency> < groupId> org.slf4j< / groupId> < artifactId> slf4j-api< / artifactId> < version> $ {org.slf4j-version}< / version> < /依赖关系> < dependency> < groupId> org.slf4j< / groupId> < artifactId> jcl-over-slf4j< / artifactId> < version> $ {org.slf4j-version}< / version> < scope>运行时< / scope> < /依赖关系> < dependency> < groupId> org.slf4j< / groupId> < artifactId> slf4j-log4j12< / artifactId> < version> $ {org.slf4j-version}< / version> < scope>运行时< / scope> < /依赖关系> < dependency> < groupId> log4j< / groupId> < artifactId> log4j< / artifactId> < version> 1.2.15< / version> <排除项> <排除> < groupId> javax.mail< / groupId> < artifactId>邮件< / artifactId> < /排除> <排除> < groupId> javax.jms< / groupId> < artifactId> jms< / artifactId> < /排除> <排除> < groupId> com.sun.jdmk< / groupId> < artifactId> jmxtools< / artifactId> < /排除> <排除> < groupId> com.sun.jmx< / groupId> < artifactId> jmxri< / artifactId> < /排除> < /排除> < scope>运行时< / scope> < /依赖关系> <! - @Inject - > < dependency> < groupId> javax.inject< / groupId> < artifactId> javax.inject< / artifactId> < version> 1< / version> < /依赖关系> <! - Servlet - > < dependency> < groupId> javax.servlet< / groupId> < artifactId> servlet-api< / artifactId> < version> 2.5< / version> < scope>提供< / scope> < /依赖关系> < dependency> < groupId> javax.servlet.jsp< / groupId> < artifactId> jsp-api< / artifactId> < version> 2.1< / version> < scope>提供< / scope> < /依赖关系> < dependency> < groupId> javax.servlet< / groupId> < artifactId> jstl< / artifactId> < version> 1.2< / version> < /依赖关系> <! - Test - > < dependency> < groupId> junit< / groupId> < artifactId> junit< / artifactId> < version> 4.7< / version> < scope> test< / scope> < /依赖关系> < dependency> < groupId> org.easymock< / groupId> < artifactId> easymock< / artifactId> < version> 3.1< / version> < /依赖关系> < dependency> < groupId> org.hibernate< / groupId> < artifactId> hibernate-entitymanager< / artifactId> < version> 4.3.0.CR1< / version> < /依赖关系> < dependency> < groupId> com.h2database< / groupId> < artifactId> h2< / artifactId> < version> 1.3.174< / version> < /依赖关系> < dependency> < groupId> org.springframework< / groupId> < artifactId> spring-test< / artifactId> < version> 3.2.5.RELEASE< / version> < /依赖关系> < dependency> < groupId> org.springframework< / groupId> < artifactId> spring-jpa< / artifactId> < version> 2.0.8< / version> < /依赖关系> < dependency> < groupId> org.springframework< / groupId> < artifactId> spring-jdbc< / artifactId> < version> 3.2.5.RELEASE< / version> < /依赖关系> < dependency> < groupId> org.springframework.data< / groupId> < artifactId> spring-data-jpa< / artifactId> < version> 1.4.2.RELEASE< / version> < /依赖关系> < dependency> < groupId> org.hibernate.javax.persistence< / groupId> < artifactId> hibernate-jpa-2.0-api< / artifactId> < version> 1.0.1.Final< / version> < /依赖关系> < /依赖关系> < build> < plugins> < plugin> < artifactId> maven-eclipse-plugin< / artifactId> < version> 2.9< / version> <配置> < additionalProjectnatures> < projectnature> org.springframework.ide.eclipse.core.springnature< / projectnature> < / additionalProjectnatures> < additionalBuildcommands> < buildcommand> org.springframework.ide.eclipse.core.springbuilder< / buildcommand> < / additionalBuildcommands> < downloadSources> true< / downloadSources> < downloadJavadocs> true< / downloadJavadocs> < / configuration> < / plugin> < plugin> < groupId> org.apache.maven.plugins< / groupId> < artifactId> maven-compiler-plugin< / artifactId> < version> 2.5.1< / version> <配置> < source> 1.6< / source> < target> 1.6< / target> < compilerArgument> -Xlint:all< / compilerArgument> < showWarnings> true< / showWarnings> < showDeprecation> true< / showDeprecation> < / configuration> < / plugin> < plugin> < groupId> org.codehaus.mojo< / groupId> < artifactId> exec-maven-plugin< / artifactId> < version> 1.2.1< / version> <配置> < mainClass> org.test.int1.Main< / mainClass> < / configuration> < / plugin> < / plugins> < / build> < / project>我是Spring MVC的完全noob,无法找到问题。 b
解决方案这听起来像是一个ClassLoader冲突。我敢打赌,你在类路径上有javax.persistence api 1.x,而Spring试图访问 ValidationMode ,仅在JPA 2.0中引入。
C $ C><依赖性> < groupId> javax.persistence< / groupId> < artifactId> persistence-api< / artifactId> < version> 1.0< / version> < /依赖关系>并将其从您的设置中删除。 (请参阅排除依存关系)
AFAIK JPA 2没有这样的通用发行版,但您可以使用这个Hibernate特有的版本:
<依赖性> < groupId> org.hibernate.javax.persistence< / groupId> < artifactId> hibernate-jpa-2.0-api< / artifactId> < version> 1.0.1.Final< / version> < /依赖关系>好的,因为这不起作用,您似乎还有一些JPA-1版本某处。 在一个测试方法中,添加以下代码: $ p $ System.out.println(EntityManager.class.getProtectionDomain() .getCodeSource() .getLocation());
查看指向您的位置并摆脱那件神器。
啊,现在我终于看到了问题。摆脱这一点:
<依赖关系> < groupId> org.springframework< / groupId> < artifactId> spring-jpa< / artifactId> < version> 2.0.8< / version> < /依赖关系>并将其替换为
<依赖性> < groupId> org.springframework< / groupId> < artifactId> spring-orm< / artifactId> < version> 3.2.5.RELEASE< / version> < /依赖关系>另一方面,您应该将所有测试库(spring-test,easymock等)设置为
< scope> test< / scope>
I am trying to run a dbtest but I get the following error :
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [root-context.xml]: Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;"
And because of that I also get the following error:
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository' defined in class path resource [root-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [root-context.xml]: Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
So we have to take alook at my root-context file and it look the following :
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="www.springframework/schema/beans" xmlns:xsi="www.w3/2001/XMLSchema-instance" xsi:schemaLocation="www.springframework/schema/beans www.springframework/schema/beans/spring-beans.xsd"> <!-- Root Context: defines shared resources visible to all other web components <bean id="personService" class="se.lowdin.civilforsvaret.webapp.services.PersonServiceImpl" /> --> <bean id="personRepository" class="se.lowdin.civilforsvaret.webapp.repositories.PersonRepositoryJpa" /> <!-- Database --> <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/civilforsvaret11" /> <property name="username" value="bla" /> <property name="password" value="bla" /> </bean> <!-- Entity Manager --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="datasource" /> <property name="persistenceUnitName" value="civilforsvaret" /> </bean> <!-- Transaction Manager --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> </beans>And the persisence.xml looks the following :
<persistence xmlns="java.sun/xml/ns/persistence" xmlns:xsi="www.w3/2001/XMLSchema-instance" xsi:schemaLocation="java.sun/xml/ns/persistence java.sun/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="civilforsvaret" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <property name="hibernate.show_sql" value="true"/> </properties> </persistence-unit> </persistence>And this is my pom.xml file :
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="maven.apache/POM/4.0.0" xmlns:xsi="www.w3/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache/POM/4.0.0 maven.apache/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>se.lowdin</groupId> <artifactId>civilforsvaret</artifactId> <name>civilforsvaret-webbapp</name> <packaging>war</packaging> <version>1.0.0-BUILD-SNAPSHOT</version> <properties> <java-version>1.6</java-version> <org.springframework-version>3.1.1.RELEASE</org.springframework-version> <org.aspectj-version>1.6.10</org.aspectj-version> <org.slf4j-version>1.6.6</org.slf4j-version> </properties> <dependencies> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- AspectJ --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${org.aspectj-version}</version> </dependency> <!-- MySql connection --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.24</version> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> </exclusion> <exclusion> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </exclusion> <exclusion> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> </exclusion> <exclusion> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> </exclusion> </exclusions> <scope>runtime</scope> </dependency> <!-- @Inject --> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- Test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.3.0.CR1</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.3.174</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jpa</artifactId> <version>2.0.8</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>3.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.4.2.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <additionalProjectnatures> <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> </additionalProjectnatures> <additionalBuildcommands> <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> </additionalBuildcommands> <downloadSources>true</downloadSources> <downloadJavadocs>true</downloadJavadocs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>1.6</source> <target>1.6</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>org.test.int1.Main</mainClass> </configuration> </plugin> </plugins> </build> </project>I am a complete noob with Spring MVC and cant find the problem.
解决方案This sounds like a ClassLoader conflict. I'd bet you have the javax.persistence api 1.x on the classpath somewhere, whereas Spring is trying to access ValidationMode, which was only introduced in JPA 2.0.
Since you use Maven, do mvn dependency:tree, find the artifact:
<dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> </dependency>And remove it from your setup. (See Excluding Dependencies)
AFAIK there is no such general distribution for JPA 2, but you can use this Hibernate-specific version:
<dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> </dependency>OK, since that doesn't work, you still seem to have some JPA-1 version in there somewhere. In a test method, add this code:
System.out.println(EntityManager.class.getProtectionDomain() .getCodeSource() .getLocation());See where that points you and get rid of that artifact.
Ahh, now I finally see the problem. Get rid of this:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jpa</artifactId> <version>2.0.8</version> </dependency>and replace it with
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.5.RELEASE</version> </dependency>On a different note, you should set all test libraries (spring-test, easymock etc.) to
<scope>test</scope>
更多推荐
创建名为'entityManagerFactory'的bean时出错
发布评论