1. 程式人生 > >記一次部署時報java.lang.NoSuchMethodError:javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax / persistence / ValidationMode;的解決辦法

記一次部署時報java.lang.NoSuchMethodError:javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax / persistence / ValidationMode;的解決辦法

樓主在部署war包的時候,本地啟動不報錯,伺服器商報如下問題:

Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; 
nested exception is java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax
/persistence/ValidationMode;

 這個方法明顯是jar包下的方法找不到,而非自寫的方法或者類;但是我們又在pom檔案中引用了該類,且在war包解壓lib檔案中確實有此類;

網上很多說是依賴項版本問題,說因為引入了JPA 1 API,但方法getValidationMode僅在JPA 2之後才存在,建議將pom檔案中jpa依賴改成如下:

 <dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</
artifactId>
<version>1.0.1.Final</version>
</dependency>

但樓主本來就用的JPA 2版本;最後只能懷疑是jar包衝突,

       <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>1.1.4</
version> <exclusions> <exclusion> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> </exclusion> </exclusions> </dependency>

將pom中依賴修改為此問題就解決了!!

此處需要exclusions來進行排除依賴。
例如這樣一個情況,工程中引入了A,A依賴B,但是B的版本過舊。
此時可以使用exclusions排除該傳遞性依賴,並顯示宣告一個最新版本的B依賴。

所以。。。。。此處就不會根據mapper-spring-boot-starter找到其底下老版本的persistence而導致沒有ValidationMode方法了,通過exclusions宣告一個新依賴,就成功解決問題啦~

以上~