摘要:今天在對項目進行國際化改造時遇到了這個異常。最后查出是由于包沖突導致這個異常的發生。我創建了兩個簡單的工程對這個異常情景進行模擬。現在部署這個工程,會得到這個異常。雖然異常名字不同,但反映的還是這個類沒有這個屬性。
今天在對項目進行國際化改造時遇到了java.lang.NoSuchMethodError這個異常。最后查出是由于jar包沖突導致這個異常的發生。下面描述這個異常發生的情景。
我創建了兩個簡單的maven工程對這個異常情景進行模擬。其中一個工程是test_dependency,它的maven配置如下,這個工程有一個spring-2.5.6依賴。
另一個工程是test,它的主要maven配置如下。
test是一個war類型的工程,它依賴于spring-X-3.2.1.RELEASE的一些jar包,并且依賴前面的test_dependency,這樣就導致了test工程間接依賴了spring-2.5.6這個jar。現在test工程中同時存在了兩個spring版本,并且注意spring-x-3.2.1.RELEASE是在spring-2.5.6之前被依賴的。
在spring的配置文件中,有下面的用于國際化的bean配置。
其中basename是資源文件的名字,defaultEncoding是編碼格式,如果沒有defaultEncoding,那么中文會亂碼。
現在部署這個工程,會得到BeanCreationException這個異常。異常主要內容如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name "messageSource" defined in class path resource [context.xml]: Error setting property values; nested exception is Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property "defaultEncoding" of bean class [org.springframework.context.support.ResourceBundleMessageSource]: Bean property "defaultEncoding" is not writable or has an
這個異常大致內容就是說ResourceBundleMessageSource這個類沒有defaultEncoding這個屬性。
ctrl加鼠標左鍵查看ResourceBundleMessageSource這個類的源碼,確實有defaultEncoding這個屬性啊!
spring配置文件不行,嘗試直接通過方法調用設置編碼。在spring配置文件中去掉defaultEncoding的配置。在servlet中加入如下代碼:
ResourceBundleMessageSource messageSource = springContext.getBean(ResourceBundleMessageSource.class); messageSource.setDefaultEncoding("utf-8");
這次啟動web成功了,但是訪問接口時又報了下面的異常。
雖然異常名字不同,但反映的還是ResourceBundleMessageSource這個類沒有defaultEncoding這個屬性。
查看源碼明明是有defaultEncoding這個屬性的,可是卻報沒有這個屬性的異常。于是執行mvn dependency:tree命令查看所有依賴的jar包,終于發現了除了spring3.x的依賴外,還有一個spring-2.5.6的依賴。查看spring-2.5.6的源碼,發現它也有一個ResourceBundleMessageSource類,并且這個類中沒有defaultEncoding這個屬性。看來當部署war包時,使用的類是來自于spring-2.5.6這個jar,而不是來自于spring3.x。修改maven的配置如下,排除對spring-2.5.6的依賴,問題就解決了。
發生這個異常要滿足下面的條件:
1.首先工程類型必須是war,如果是jar的話不會發生這個異常。
2.其次是spring-3.x的依賴必須在spring-2.5.6的前面配置,否則編譯時就會報錯找不到這個屬性,也就不會發生這個異常了。
可是為什么在編譯的時候使用spring-3.x依賴,運行時卻使用spring-2.5.6這個依賴呢?感覺這真是maven的一個大坑啊。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70233.html
摘要:具體操作如下在下,在文本框中搜索選擇第二種可能性解決主要是里面的和中的與沖突刪除即可,具體方法在下,在文本框中搜索選擇在該應用的目錄刪除目前貌似就這么兩種解決方法吧親測第一種可用 showImg(https://segmentfault.com/img/bVOIUy?w=590&h=49); showImg(https://segmentfault.com/img/bVOIXc?w=5...
摘要:用一張思維導圖盡可能囊括一下的類加載過程的全流程。本文參考自來自周志明深入理解虛擬機第版,拓展內容建議讀者可以閱讀下這本書。 用一張思維導圖盡可能囊括一下JVM的類加載過程的全流程。 本文參考自來自周志明《深入理解Java虛擬機(第2版)》,拓展內容建議讀者可以閱讀下這本書。 showImg(http://ocxhn1mzz.bkt.clouddn.com/class%20loadin...
常見問題(及其解決方案) 編譯器的問題 Microsoft Windows系統上常見的錯誤消息。 javac is not recognized as an internal or external command, operable program or batch file 如果你收到這個錯誤,Windows將無法找到編譯器(javac)。 這里有一種方法可以告訴Windows哪里可以找到ja...
閱讀 1676·2021-11-19 09:40
閱讀 2933·2021-09-24 10:27
閱讀 3220·2021-09-02 15:15
閱讀 1881·2019-08-30 15:54
閱讀 1205·2019-08-30 15:54
閱讀 1373·2019-08-30 13:12
閱讀 636·2019-08-28 18:05
閱讀 2801·2019-08-27 10:53