程序请求报错java.lang.NoSuchMethodError

文章描述了一个因模块版本不匹配引发的Java运行时异常NoSuchMethodError,具体是A模块的AuditLogController尝试调用B模块的AuditLogService方法,但B模块的版本错误。问题源于测试人员在打包时选择了高版本B模块,而实际部署使用了低版本。解决方案包括检查和匹配模块版本,清理缓存,以及确保类文件兼容。此外,强调了使用专业工具查看class文件的重要性。
摘要由CSDN通过智能技术生成
[23-7-3 9:09:19:069 CST] 00000017 ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E:
 应用程序 east5_20230629_war 中 servlet XXX 的某一服务方法创建了未捕获到的异常。
创建的异常:org.springframework.web.util.NestedServletException:
 Handler processing failed; nested exception is java.lang.NoSuchMethodError: 

XXX/XXX/subsystem/s/AuditLogService.getAuditLogList(IILjava/util/Map;)Ljava/util/List; 
at org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1275) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:951)
 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:867) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:951)

 报错信息如上图

问题原因:报错原因找不到这个方法:AuditLogService.getAuditLogList(IILjava/util/Map;)

AuditLogController在A模块

AuditLogService在B模块

测试人员打包A模块的时候未选择对应版本的B模块,选择了高版本的B模块,但是发布版本使用的是低版本的B模块

匹配版本:

A模块 -> AuditLogController.getAuditLogList(int start,int limit,HashMap map);

B模块 -> AuditLogService.getAuditLogList(int start,int limit,HashMap map);

非匹配版本:

A模块 -> AuditLogController.getAuditLogList(int start,int limit,HashMap map);

B模块 -> AuditLogService.getAuditLogList(int start,int limit,Map map);

原因:非匹配版本打包 AuditLogController.getAuditLogList(int start,int limit,HashMap map);

查看非匹配版本A模块调用时HashMap有强转Map的动作 如下图


记录当时排查了如下方面

  1. 清除was缓存
  2. jdk打包版本和现场was-jdk版本比对 ->都是1.6
  3. 部署是否存在多个版本B.jar
  4. 清除OSGi类缓存、清除JVM类缓存
  5. XXX的war里面是否存在class文件
  6. 清除缓存
  7. 程序包版本匹配问题
  8. class文件反编译查看( ⚠️注意不要使用idea看class文件,要用专门的工具看, idea看class会没有强转的内容; 如luyten

ps:8很重要,花时间买来的教训

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值