2016-02-01 172 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代理對象上]的