我有两个应用程序在服务器上运行,当我尝试通过 HttpInvoking 运行方法时,出现以下错误:
CustomSoapFaultMappingExceptionResolver 28 org.springframework.remoting.RemoteInvocationFailureException:
Invocation of method [public abstract RmiDataTransferObject OnlineServiceI.getServed(...,...)]
failed in HTTP invoker remote service at [http://localhost:8080/vmosvcs/vmoservice/onlineServiceHttp];
nested exception is java.lang.NoSuchMethodException: com.sun.proxy.$Proxy76.getServed(..., ...)
这就是过去两周我的现实,我开始感到沮丧。但今天我发现,代理对象实际上有一个名为 getServed 的方法,具有正确的返回和参数类型。但我在服务器上没有找到它......
经过一些调试,我在这个被上帝遗弃的方法中找到了答案:
private static boolean arrayContentsEq(Object[] a1, Object[] a2) {
if (a1 == null) {
return a2 == null || a2.length == 0;
}
if (a2 == null) {
return a1.length == 0;
}
if (a1.length != a2.length) {
return false;
}
for (int i = 0; i < a1.length; i++) {
if (a1[i] != a2[i]) {
return false;
}
}
return true;
}
这是在 Class.class (JDK 6) 中声明的,用于确定调用参数是否与主机参数匹配。那里没什么奇怪的。
但是看看第四个 if 语句。观察传入的数组,它们确实具有相同数量的参数和相同的类型(在 Eclipse 的调试 View 中观察这一点)。这些参数是正确的,由我的对象之一 (my.object.ObjectType) 和一个 int 组成。在比较我的对象类型的参数时,它失败了......
我不是 Java 专家,但这不是不正确的吗?那种类型的比较会尝试比较对象地址,而不是对象类型?如果我不将同一个对象与其自身进行比较,它必然会失败。而且由于是通过http调用调用的代理对象,所以不能保证参数是同一个对象?还是我大错特错了?
最佳答案
好吧,就像大多数时候一样,这是依赖性问题。我有两个不同版本的相关对象类(一个在 war 中,一个在应用程序服务器依赖项中)。因此,当比较不同的对象类型时,确实存在同一对象类的两个不同实例。
嗯,它让我能够深入研究 Class.class 代码,这总是很有趣。
关于java - NoSuchMethod : Parameter comparisson differs. 相同类型,不同对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35131777/