2016-02-01 129 views
3

我有一台服务器上运行的应用程序,当我尝试运行通过HttpInvoking的方法,我得到以下错误:NoSuchMethod:参数比较不同。同一类型,不同的对象

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)申报,并确定调用参数是否匹配主机参数。没有什么奇怪的。

但看看4:th if语句。观察进来的数组,它们具有相同数量的参数和相同类型(在eclipse中的调试视图中观察它)。参数是正确的,由我的一个对象(my.object.ObjectType)和一个int组成。通过比较我的objecttype的参数,它失败...

我不是Java专家,但没有那么不正确。这种类型的比较将尝试比较对象地址,而不是对象类型?如果我不比较同一个对象和它本身,它肯定会失败。因为它是通过http调用调用的代理对象,所以不可能确保参数是同一个对象?或者我很误会?

+0

可能的复制(http://stackoverflow.com/questions/34991742/jdkaopdynamicproxy-through-httpinvokerproxyfactory-nosuchmethod-on-proxy-object) – jhamon

+1

请停止复制自己的问题:相同[这里](http://stackoverflow.com/questions/34949118/spring-remoting-jdkdynamicaopproxy-with-no-methods)和[there](http://stackoverflow.com/questions/34949118/spring-remoting -jdkdynamicaopproxy-with-no-methods) – jhamon

+0

我很抱歉,但他们并不是真正的问题。同一地区,同样的问题,但不同的问题。这是关于Java中的比较,以及为什么对代理对象的调用似乎需要相同的对象而不是关于参数的相同对象类型。 –

回答

0

好吧,这是大多数时候的依赖问题。我有两个不同版本的对象类(一个在战争中,另一个在应用程序服务器依赖关系中)。因此,当比较不同的对象类型时,确实存在两个不同的同一对象类的实例。

好吧,它允许我深入研究Class.class代码,这总是很有趣。 [通过HTTPInvokerProxyFactory JdkAopDynamicProxy:NoSuchMethod代理对象上]的