2011-11-25 51 views
0

因此,我正在連接到使用Axis的RPC編碼Web服務。不幸的是,從Axis轉換不是一種選擇,我的應用程序目前正在使用Spring。Spring從RPC編碼的Webservice客戶端獲取IP地址

我的Spring配置目前看起來類似於:

<bean id="appWebServiceClient" 
    class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean"> 
    <property name="serviceInterface" 
     value="app.test.stubs.external.Gateway_PortType"/> 
    <property name="wsdlDocumentUrl" value="${app.url}"/> 
    <property name="namespaceUri" value="${app.namespace}"/> 
    <property name="serviceName" value="${app.servicename}"/> 
    <property name="portName" value="${app.portname}"/> 
    <property name="lookupServiceOnStartup" value="false"/> 
    <property name="customPropertyMap"> 
     <map> 
      <entry key="axis.connection.timeout"> 
       <value type="java.lang.Integer">${app.timeout}</value> 
      </entry> 
     </map> 
    </property> 

我再注入上述豆成具有Gateway_PortType(由Axistools產生存根接口)的instansiation處理類,然後我用實際調用我嘗試連接的服務器上的方法。

我的問題是我需要自動獲取我發送到的服務器的IP,即instaniated Gateway_PortType。任何想法如何做到這一點?我曾嘗試將注入的豆投入到JaxRpcPortProxyFactoryBean/org.apache.axis.client.Stub以嘗試獲取IP或主機名,但無濟於事。如果我試圖得到instansiated對象的.getClass().getName(),我所得到的是$Proxy44或類似的東西。任何幫助,將不勝感激

回答

0

我對Axis瞭解不多,但我對Spring及其代理行爲知之甚少。由於某些原因,Spring必須圍繞appWebServiceClient創建代理。這可能是因爲@Transactional註釋,這可能是因爲您明確聲明瞭代理,或者可能是因爲您有方面(我確信還有其他原因)。

每當你聲明你的代理時,你(也許是隱含的)也指定你想要的代理類型。有兩種代理。第一個(通常是默認的)是基於JDK的代理。第二個是CGLIB代理。例如,許多人通過將以下行添加到其應用程序上下文來啓用代理。

<aop:aspectj-autoproxy/> 

上面的行有一些隱藏的含義。通過添加該行來配置spring以儘可能使用JDK代理。如果你想使用CGLIB代理,那麼你會說:

<aop:aspectj-autoproxy proxy-target-class="true"/> 

的CGLIB代理和JDK代理之間差異的完整列表超出了本答覆的範圍。主要的重要區別是CGLIB代理可以在類上工作,並且JDK代理可以在接口上工作。

由於您使用的是JDK代理,並且您的類實現了至少一個接口,因此春天創建的代理將僅包含您的類的接口。這意味着生成的類原型將如下所示:

public class $Proxy44 implements interfaceA, interfaceB, interfaceC { 

顯然$ Proxy44不能被鑄造到JaxRpcPortProxyFactoryBean或任何基類(例如org.apache.axis.client.Stub)。它可以被轉換成任何接口。因此,如果您可以將IP地址轉換爲接口(例如javax.xml.rpc.Stub),那麼您應該轉到該路由。

如果沒有一個接口會提供IP地址,那麼我的頭頂就可以添加一個新的接口到你的存根類(這可能是不可能的,因爲它是自動生成的),使用CGLIB代理(在那裏可能是這樣做的其他影響),而不是代理類(這是可行的,這取決於你爲什麼要做代理),或者訪問代理目標(甚至不知道這是可能的,如果是的話)是非常危險的,我不會推薦它)。

也可能有其他一些解決方案,但不知道更多這是很難說。

+0

感謝您的答覆佩斯,根據您的建議,我設法將代理類轉換爲javax.rmi.Remote,但是我在檢索IP地址或主機名方面沒有取得進展。基本上我的代碼如下所示: public String getIPAddress(Object stub) { \t java.rmi.Remote remote =(Remote)stub; \t String hostIpAddress =((org.apache.axis.client.Stub)remote)._ getService()。getWSDLDocumentLocation()。getHost(); } 根據我對Axis的經驗,以上是獲取主機名或Ip的正確方法,但仍然得到類轉換異常。 – user1065956

+0

您是否嘗試將存根轉換爲(javax.xml.rpc.Stub)? – Pace