真實經歷 | Spring-boot中引入devtools熱部署引發的問題

年底一直在忙着趕項目,爲了方便項目的本地開發調試,我給項目引入了spring-boot-devtools熱部署,誰知引來了莫名奇妙的問題,代碼中老是拋ClassCastException。可檢查代碼卻找任何問題。這真的是見鬼了,搞得很懵逼!

一,發生異常惡的代碼

編譯並已經測試好的代碼突然就拋異常,真是見鬼,也找不出任何原因,代碼邏輯沒任何問題,下面是拋出的異常信息。


從打印的異常日誌裏可以明顯看的出,代碼執行到577行時拋出了異常信息ClassCastException,那我們來看下577行的代碼,如下:


就用了Java8新特性實現了一個排序,都測試好好的代碼突然不行了,沒任何編譯錯誤,真是不應該發生呀。roomPrice對象的屬性封裝類如下,真是找不到任何問題。


實在找不到原因,我開始質疑是否爲Java8新特性的原因,因此,代碼改爲增強for循環,然後測試執行,又是580行拋出ClassCastException。異常信息如下:


再定位到實現類的拋異常的580行代碼,就是改寫後的for循環。真是沒轍了,找不到原因的我只能一臉懵逼。


這次,我相信與java8新特性無關,這個莫名的ClassCastException究竟來自何方,我開始查找原因。

二,異常原因與處理方法

檢查了半天,沒發現任何問題,懵逼的我只好問問邊上的小兄弟,協助一起查找原因,結果是項目中引入spring-boot-devtools惹的禍
在項目的pom文件裏,依賴了spring-boot-devtools的包,代碼如下:


然後幹掉這個依賴,項目運行一切正常。

其他解決方法(來源stackoverflow):

This is a known limitation of Devtools. When the cache entry is deserialized, the object is not attached to the proper classloader.

There are various ways you can fix this issue:

1,Disable cache when you’re running your application in development

2,Use a different cache manager (if you’re using Spring Boot 1.3, you could force a simple cache manager using the spring.cache.type property in application-dev.properties and enable the dev profile in your IDE)

3,Configure memcached (and things that are cached) to run in the application classloader. I wouldn’t recommend that option since the two first above are much easier to implement

翻譯:

這是Devtools的已知限制,當反序列化高速緩存條目時,該對象未附加到類加載器。

你可以通過多種方式解決此問題:

1,在開發中運行應用程序時禁用緩存。

2,使用其他緩存管理器(如果您使用的是Spring Boot 1.3,則可以使用application-dev.properties中的spring.cache.type屬性強制使用簡單的緩存管理器,並在IDE中啓用開發配置文件)。

3,配置memcached(以及緩存的內容)以在應用程序類加載器中運行。我不建議使用該選項,因爲上面的前兩個更容易實現。

推薦閱讀:

SpringBoot 實現系統控制併發登錄人數

SpringBoot基於數據庫的定時任務實現
Java中大量if...else語句的消除替代方案


掃碼關注公衆號,發送關鍵詞獲取相關資料:發“Springboot”領取電商項目實戰源碼;發“SpringCloud”領取學習實戰資料;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章