2

这是我得到的错误:

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)
4

2 回答 2

6

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

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

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

    java.util.ArrayList getList(Lepo.User arg0, 
                                String arg1, String arg2, 
                                String arg3, String arg4)
    
  • 该类Order未声明具有该签名的方法。(它可能有不同的签名,或者根本不存在。)

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

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

  • 您已经部署了其中一个类的新版本,而没有部署另一个类的新版本。

  • 您已经部署了其中一个类的过时版本。

  • 您的类路径中有一个或其他类的两个版本,并且您无意中更改了类路径搜索顺序。

你需要做的是找出不兼容的类来自哪里,以及它们是如何到达那里的。一旦你弄清楚了,修复可能是不言而喻的。


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

  1. 软件包名称应以您组织的域名开头,颠倒。“com。” 是错的。
  2. 包名应该全部小写。“lepo”如果是包名是错误的,如果是默认包中的类,那也是错误的。

(您的问题可能是修复假名的后果Lepo.User......)

于 2012-10-16T02:40:47.493 回答
0

运行时 jar 可能与您用于编译代码的 jar 不同。您还可能在类路径上有多个 jar,它们包含相同的类并相互遮蔽。您可能想要检查您的应用服务器运行时类路径和 jar 顺序。

于 2012-10-16T02:30:18.537 回答