摘要:今天在對(duì)項(xiàng)目進(jìn)行國(guó)際化改造時(shí)遇到了這個(gè)異常。最后查出是由于包沖突導(dǎo)致這個(gè)異常的發(fā)生。我創(chuàng)建了兩個(gè)簡(jiǎn)單的工程對(duì)這個(gè)異常情景進(jìn)行模擬?,F(xiàn)在部署這個(gè)工程,會(huì)得到這個(gè)異常。雖然異常名字不同,但反映的還是這個(gè)類沒(méi)有這個(gè)屬性。
今天在對(duì)項(xiàng)目進(jìn)行國(guó)際化改造時(shí)遇到了java.lang.NoSuchMethodError這個(gè)異常。最后查出是由于jar包沖突導(dǎo)致這個(gè)異常的發(fā)生。下面描述這個(gè)異常發(fā)生的情景。
我創(chuàng)建了兩個(gè)簡(jiǎn)單的maven工程對(duì)這個(gè)異常情景進(jìn)行模擬。其中一個(gè)工程是test_dependency,它的maven配置如下,這個(gè)工程有一個(gè)spring-2.5.6依賴。
另一個(gè)工程是test,它的主要maven配置如下。
test是一個(gè)war類型的工程,它依賴于spring-X-3.2.1.RELEASE的一些jar包,并且依賴前面的test_dependency,這樣就導(dǎo)致了test工程間接依賴了spring-2.5.6這個(gè)jar。現(xiàn)在test工程中同時(shí)存在了兩個(gè)spring版本,并且注意spring-x-3.2.1.RELEASE是在spring-2.5.6之前被依賴的。
在spring的配置文件中,有下面的用于國(guó)際化的bean配置。
其中basename是資源文件的名字,defaultEncoding是編碼格式,如果沒(méi)有defaultEncoding,那么中文會(huì)亂碼。
現(xiàn)在部署這個(gè)工程,會(huì)得到BeanCreationException這個(gè)異常。異常主要內(nèi)容如下:
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
這個(gè)異常大致內(nèi)容就是說(shuō)ResourceBundleMessageSource這個(gè)類沒(méi)有defaultEncoding這個(gè)屬性。
ctrl加鼠標(biāo)左鍵查看ResourceBundleMessageSource這個(gè)類的源碼,確實(shí)有defaultEncoding這個(gè)屬性啊!
spring配置文件不行,嘗試直接通過(guò)方法調(diào)用設(shè)置編碼。在spring配置文件中去掉defaultEncoding的配置。在servlet中加入如下代碼:
ResourceBundleMessageSource messageSource = springContext.getBean(ResourceBundleMessageSource.class); messageSource.setDefaultEncoding("utf-8");
這次啟動(dòng)web成功了,但是訪問(wèn)接口時(shí)又報(bào)了下面的異常。
雖然異常名字不同,但反映的還是ResourceBundleMessageSource這個(gè)類沒(méi)有defaultEncoding這個(gè)屬性。
查看源碼明明是有defaultEncoding這個(gè)屬性的,可是卻報(bào)沒(méi)有這個(gè)屬性的異常。于是執(zhí)行mvn dependency:tree命令查看所有依賴的jar包,終于發(fā)現(xiàn)了除了spring3.x的依賴外,還有一個(gè)spring-2.5.6的依賴。查看spring-2.5.6的源碼,發(fā)現(xiàn)它也有一個(gè)ResourceBundleMessageSource類,并且這個(gè)類中沒(méi)有defaultEncoding這個(gè)屬性。看來(lái)當(dāng)部署war包時(shí),使用的類是來(lái)自于spring-2.5.6這個(gè)jar,而不是來(lái)自于spring3.x。修改maven的配置如下,排除對(duì)spring-2.5.6的依賴,問(wèn)題就解決了。
發(fā)生這個(gè)異常要滿足下面的條件:
1.首先工程類型必須是war,如果是jar的話不會(huì)發(fā)生這個(gè)異常。
2.其次是spring-3.x的依賴必須在spring-2.5.6的前面配置,否則編譯時(shí)就會(huì)報(bào)錯(cuò)找不到這個(gè)屬性,也就不會(huì)發(fā)生這個(gè)異常了。
可是為什么在編譯的時(shí)候使用spring-3.x依賴,運(yùn)行時(shí)卻使用spring-2.5.6這個(gè)依賴呢?感覺(jué)這真是maven的一個(gè)大坑啊。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70233.html
摘要:具體操作如下在下,在文本框中搜索選擇第二種可能性解決主要是里面的和中的與沖突刪除即可,具體方法在下,在文本框中搜索選擇在該應(yīng)用的目錄刪除目前貌似就這么兩種解決方法吧親測(cè)第一種可用 showImg(https://segmentfault.com/img/bVOIUy?w=590&h=49); showImg(https://segmentfault.com/img/bVOIXc?w=5...
摘要:用一張思維導(dǎo)圖盡可能囊括一下的類加載過(guò)程的全流程。本文參考自來(lái)自周志明深入理解虛擬機(jī)第版,拓展內(nèi)容建議讀者可以閱讀下這本書。 用一張思維導(dǎo)圖盡可能囊括一下JVM的類加載過(guò)程的全流程。 本文參考自來(lái)自周志明《深入理解Java虛擬機(jī)(第2版)》,拓展內(nèi)容建議讀者可以閱讀下這本書。 showImg(http://ocxhn1mzz.bkt.clouddn.com/class%20loadin...
常見(jiàn)問(wèn)題(及其解決方案) 編譯器的問(wèn)題 Microsoft Windows系統(tǒng)上常見(jiàn)的錯(cuò)誤消息。 javac is not recognized as an internal or external command, operable program or batch file 如果你收到這個(gè)錯(cuò)誤,Windows將無(wú)法找到編譯器(javac)。 這里有一種方法可以告訴Windows哪里可以找到j(luò)a...
閱讀 1686·2021-11-19 09:40
閱讀 2939·2021-09-24 10:27
閱讀 3227·2021-09-02 15:15
閱讀 1888·2019-08-30 15:54
閱讀 1213·2019-08-30 15:54
閱讀 1377·2019-08-30 13:12
閱讀 642·2019-08-28 18:05
閱讀 2808·2019-08-27 10:53