SpringBoot 版本升級后報錯 Cannot instantiate interface org.springframework.context.ApplicationContextInitializer


  本篇博客純粹講我遇到這個問題的解決以及思考,如果你想知道解決方法,可以直接看正確解決方案部分。因為是前端寫的,所以可能有些明顯的內容很容易就看出來了。

  首先:升級后更新其他依賴,以及Application.yml的配置,去除舊的內容就不說了,比較簡單。

  遇到這個問題,是因為 SpringBoot 升級 后導致的,程序不能運行,至於原因,則是因為我們 前端寫后台代碼,大部分是根據之前項目 配置,所以版本過低,而需要升級。

  寫這篇文章是記錄一下自己的思考,以及其中的周折,也幫助其他人快速找到問題的根源。也許會有人問,你們后台呢。他們沒有這么升級過,給的建議是直接一步步導入到一個新的項目中。。而我覺得,問題既然產生,定然是有原因的,若沒找到,導入也不一定好轉,反而錯過了踩坑的機會。

  錯誤內容:

    org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer

    Cannot instantiate interface org.springframework.context.ApplicationContextInitializer

  第二句已經寫出來了,是springframework 上下文內容問題,啟動時報錯。第一句搜索基本不是相關問題,第二句得到一個答案:升級 springframework.version 為 2.0以上,但是仍然會報錯。

  下面產生我的第一個思路:

    檢查導入的依賴,果然發現有一個 org.springframework.boot 版本為 1.3.6, 果斷更新,到官網查找后發現2.0.3版本,在項目引入,版本依然是1.3.6,因為 SpringBoot 2.0后移除了這個依賴。但由於 Application 啟動,並不必須 SpringBootServletInitializer, 果斷刪除。 在.xml 中移除依賴。

    結果打包成功!但在tomcat訪問產生404。。

  下面產生第二個思路:(這個思路其實是無理的,可以節省的)

    看到SpringBoot 官網文檔說,2.0以后導出war包必須要有SpringBootServletInitializer,但在我加上后導入依賴仍然是1.3.6, 我就抱着僥幸的心里,導入了2.0.3版本的 org.springframework.boot ,僥幸的想着,可能運行不了,但打的包可以用,然后打完war包,再返回來去掉,運行代碼。這哪里符合簡潔的標准!!!接着跟着網上配置了一波 xml, 打了一系列包,在tomcat中都啟動失敗。

  下面產生第三個思路:

    我為何不新建一個SpringBoot 2.0的項目,測試打包是否可行!!想到就做,這里說以SpringBoot 項目新建完后需要導入spring-boot-starter-web,spring-boot-starter-tomcat兩個依賴。然后引入 SpringBootServletInitializer ,發現並沒有讓我導入依賴。至此,發現差異。回頭解決。其實完全不需要導入org.springframework.boot 依賴,而是直接導入org.springframework.boot.web.servlet.support.SpringBootServletInitializer;即可。

  接着clean,運行打包,放入tomcat。go ok!

 

  正確解決方案:

  首先繼承 SpringBootServletInitializer , 但不要導入 org.springframework.boot 。 導入org.springframework.boot.web.servlet.support.SpringBootServletInitializer;即可。

 

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(Application.class);
	}

	public static void main(String[] args) throws Exception {
		SpringApplication.run(Application.class, args);
	}

}

  修改pom.xml, clean 項目,重新打包即可。

  

<packaging>war</packaging>

<dependencies>
	<!-- … -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-tomcat</artifactId>
		<scope>provided</scope>
	</dependency>
	<!-- … -->
</dependencies>

  

  隨感

  其實這個顯然從到到尾並不是很難的問題,一切都要按照合理的思路思考,並且不煩躁,應該會解決的更快一些。可能因為馬上要放高溫假了,就想着趕快把一切處理好,多加備用方案。所以有些急了,急顯然會讓一些簡單的東西從眼皮下面溜走。。

  哇,我是前端呀!!!不要覺得這個coder要走后台了,正因為對后台不了解,才能發這些簡單的,但又讓自己繞彎的內容。。但對於前端,見到的越多,理解的越深,越發現不知道的越多,不了解的越多。只能求知若渴,不敢提筆妄談。希望有天有所認知,可以分享給大家。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM