記一次部署時報java.lang.NoSuchMethodError:javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax / persistence / ValidationMode;的解決辦法
阿新 • • 發佈:2019-01-07
樓主在部署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宣告一個新依賴,就成功解決問題啦~
以上~