java.lang.NoSuchMethodError异常

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了java.lang.NoSuchMethodError异常脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

今天在对项目进行国际化改造时遇到了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成功了,但是访问接口时又报了下面的异常。

java.lang.NoSuchMethodError异常

虽然异常名字不同,但反映的还是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的依赖,问题就解决了。

java.lang.NoSuchMethodError异常

发生这个异常要满足下面的条件:
1.首先工程类型必须是war,如果是jar的话不会发生这个异常。
2.其次是spring-3.x的依赖必须在spring-2.5.6的前面配置,否则编译时就会报错找不到这个属性,也就不会发生这个异常了。
可是为什么在编译的时候使用spring-3.x依赖,运行时却使用spring-2.5.6这个依赖呢?感觉这真是maven的一个大坑啊。

脚本宝典总结

以上是脚本宝典为你收集整理的java.lang.NoSuchMethodError异常全部内容,希望文章能够帮你解决java.lang.NoSuchMethodError异常所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。