记录一次NoSuchMethodError问题的解决

鼠扑  金牌会员 | 2022-9-29 18:54:34 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 694|帖子 694|积分 2082

一、问题描述

今天在执行单元测试时遇到了一个NoSuchMethodError错误,完整的报错信息如下:
  1. ...
  2. Caused by: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
  3.         at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:102)
  4.         at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:45)
  5.         at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolator(ConfigurationImpl.java:423)
  6.         at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolatorConfiguredWithClassLoader(ConfigurationImpl.java:575)
  7.         at org.hibernate.validator.internal.engine.ConfigurationImpl.getMessageInterpolator(ConfigurationImpl.java:364)
  8.         at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:144)
  9.         at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
  10.         at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:331)
  11.         at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:103)
  12.         at com.focus.candy.rpc.IValidation.<clinit>(IValidation.java:23)
  13.         ... 65 more
  14. Caused by: java.lang.NoSuchMethodError: javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory;
  15.         at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:98)
  16.         ... 74 more
复制代码
这意思是说,想要程序调用javax.el.ExpressionFactory.newInstance这个方法,但是到ExpressionFactory里面一看,哈,这个方法他不!存!在!
他这么大一个方法,怎么好好的就没了呢?
好吧,这就是接下来要调查的事情。
二、排查过程

一般来说,应该是在类路径里面有两个类名相同,包路径也相同的类。
程序调到了错误的同名类,所以找不到方法。
让我们来看看到底是哪个jar包的小可爱在这捣乱。
使用idea的同学请双击Shift键,全局搜索ExpressionFactory。(使用其他IDE的同学请自行查阅相关手册)
查找的结果如下:

在jsp-api-2.1.jar和javax.el-api-2.2.4.jar里面都存在javax.el.ExpressionFactory。
然后把类打开看看,发现jsp-api-2.1.jar里面的ExpressionFactory没有newInstance方法。
好吧,把jsp-api-2.1.jar排掉,问题解决。
三、解决方法

嗯,把jsp-api-2.1.jar排掉。
不过这不是重点。重点是找到冲突的类,然后解决这个冲突。
解决方法有可能是排除不需要的jar包,也可能是升级jar包或者换个jar包,这个要依据当时的情况来看了。
本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表