异常:
An attempt was made to call the method javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode; but it does not exist. Its class, javax.persistence.spi.PersistenceUnitInfo, is available from the following locations:
jar:file:/d:/Maven/repository/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar!/javax/persistence/spi/PersistenceUnitInfo.class
jar:file:/d:/Maven/repository/javax/persistence/javax.persistence-api/2.2/javax.persistence-api-2.2.jar!/javax/persistence/spi/PersistenceUnitInfo.class
It was loaded from the following location:
file:/d:/Maven/repository/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of javax.persistence.spi.PersistenceUnitInfo
今天在搭建springboot(2.1.0.RELEASE)+spring data+jpa+maven时按照书上的说法进行配置,结果就报了这个错误。后来经过网上查询资料和自己一步一步尝试,发现原来是我在pom.xml文件中配置了tk.mybatis造成的(我先是搭建了springboot+mybatis+maven的项目,后来在此基础上进行修改,故pom.xml文件中的依赖没有删除掉),因为tk.mybatis会自动引用依赖引入persistence-api-1.0.jar包,而persistence-api-1.0.jar的PersistenceUnitInfo类中并没有getValidationMode()方法,而在springboot(2.1.0.RELEASE)中自动引入的依赖persistence-api-2.2.jar包的PersistenceUnitInfo类则有实现getValidationMode()方法。此时两个类冲突了,导致报了以下的错误。
1、解决方法就是在tk.mybatis中排除掉persistence-api-1.0.jar的自动依赖,如下:
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
</exclusion>
</exclusions>
</dependency>
2、但是如果你使用到了这个persistence-api-1.0.jar包中的方法和注解,那就不能排除掉
这时候还有另一种解决方案:
在Spring boot整合JPA的时候,添加的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
将依赖改为
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
正常解决!
但是此方法原理尚不清楚