这是我得到的错误:

java.lang.NoSuchMethodError: com.Order.getList(Lepo/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/ArrayList;


在反编译这些类之后,我发现应该有一个“ Ljava / lang / String”作为第一个参数。如错误所示,该参数丢失。因此,我反编译了调用方法的类,并且它确实具有一个字符串作为第一个参数。

这是我对这里发生的事情感到困惑的地方。根据时间戳记,上一次修改此代码是2007年。大约一周前出现了此错误。

这是在JBoss 4.0.0DR3上运行的struts应用程序。据我所知,服务器上没有软件升级。

我还尝试停止JBoss,删除所有临时目录并重新启动。

有人对下一步采取行动有什么建议吗?

编辑:

这是更多的堆栈跟踪

java.lang.NoSuchMethodError: com.Order.getList(Lepo/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/ArrayList;
    at com.ViewStatusAction.retrieveList(ViewStatusAction.java:325)
    at com.ViewStatusAction.executeAction(ViewStatusAction.java:115)
    at com.BaseAction.execute(BaseAction.java:42)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)

最佳答案

我假设com.Ordercom.ViewStatusAction都是应用程序代码,而不是第三方代码。

异常意味着您有某种版本的不匹配。


ViewStatusAction类期望Order中有一个带有此签名的方法:

java.util.ArrayList getList(Lepo.User arg0,
                            String arg1, String arg2,
                            String arg3, String arg4)

Order类未声明具有该签名的方法。 (它可能具有不同的签名,或者可能根本不存在。)


最初编译ViewStatusAction时,编译器能够找到该方法。但是,现在,运行时系统无法再找到它。这仅意味着您正在使用与Order类所针对的版本不同的ViewStatusAction版本。

您需要找出为什么现在不匹配。可能的解释包括:


您已经部署了其中一个类别的新版本,而没有部署另一个类别的新版本。
您已经部署了其中一个类的过期版本。
您在类路径中有一个或另一个类的两个版本,并且您无意中更改了类路径搜索顺序。


您需要做的是找出不兼容类的来源以及它们如何到达那里。一旦弄清楚了,解决办法很明显。



我注意到您的FQ类别名称不符合公认的标准:


程序包名称应以您所在组织的域名开头,反之。 “ com”。是错的。
程序包名称应全部小写。如果“ Lepo”是软件包名称,则是错误的;如果是默认软件包中的类,那么这也是错误的。


(您的问题可能是固定假的Lepo.User名称的结果...)

10-02 23:22