[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的动作 如下图
记录当时排查了如下方面
- 清除was缓存
- jdk打包版本和现场was-jdk版本比对 ->都是1.6
- 部署是否存在多个版本B.jar
- 清除OSGi类缓存、清除JVM类缓存
- XXX的war里面是否存在class文件
- 清除缓存
- 程序包版本匹配问题
- class文件反编译查看( ⚠️注意不要使用idea看class文件,要用专门的工具看, idea看class会没有强转的内容; 如luyten)
ps:8很重要,花时间买来的教训