2008-10-30 31 views
1

我目前正在開發處理SOAP web服務的Java應用程序。在Axis中使用Java中的複雜數據類型webservice

問題在於我解析WSDL [Parser對象來自Apache Axis爲我做的事],並創建了調用。

當我嘗試調用它時,我必須傳遞一個Object []來分配參數[取自WSDL的Action]。正常的操作很簡單,但是當我有自定義數據類型時,我無法爲它填充。我嘗試傳遞Object [] {new Object {}},但它分配了第一個字段。我無法通過它已經處理,因爲它將'<>'更改爲'--lt --gt',並且服務器無法識別'。

這是WSDL的一個片段。

<s:element name="FERecuperaQTYRequest"> 
    <s:complexType> 
     <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="argAuth" type="tns:FEAuthRequest" /> 
     </s:sequence> 
    </s:complexType> 
    </s:element> 
    <s:complexType name="FEAuthRequest"> 
    <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="Token" type="s:string" /> 
     <s:element minOccurs="0" maxOccurs="1" name="Sign" type="s:string" /> 
     <s:element minOccurs="1" maxOccurs="1" name="cuit" type="s:long" /> 
    </s:sequence> 
    </s:complexType> 

這是麻煩的Java代碼片段

 QTY = (String) call.invoke (
       new Object[]{ 
        new Object[]{ 
          tokenConexion.getToken(), 
          tokenConexion.getSign(), 
          tokenConexion.getCUIT() 
           } 
          }); 
+0

到目前爲止,我認爲解決方案可能在於序列化,但即使在實現io.Serializable時,我仍然遇到'NoSerializerFound'。有誰知道我是否可以重寫一個方法來告訴它如何序列化它?更新:我可能不得不從org.apache.axis.encoding.ser實現一些對象。任何人? – 2008-10-31 18:02:10

+0

在Serializable接口的Java API中定義,您可以通過實現私有函數writeObject(java.io.ObjectOutputStream)和readObject(java.io.ObjectInputStream)來覆蓋它的序列化方式 – Vinze 2008-12-17 15:50:16

回答

1

你有看着使用類似Spring的代理功能?你可以在Spring配置文件中告訴它一些關於web服務的知識,而你所有的客戶端代碼必須處理的是你創建的一個接口 - 它甚至不需要知道另一端有web服務!

示例Spring配置:

<bean id="myService" class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean"> 
    <property name="serviceFactoryClass" value="org.apache.axis.client.ServiceFactory"/> 
    <property name="wsdlDocumentUrl" value="classpath://META-INF/myService.wsdl"/> 
    <property name="namespaceUri" value="http://com/myService"/> 
    <property name="endpointAddress" value="http://server/MyService"/> 
    <property name="serviceName" value="MyService"/> 
    <property name="portName" value="MyService"/> 
    <property name="serviceInterface" value="com.IMyService"/> 
    <property name="lookupServiceOnStartup" value="false"/> 
</bean> 
<bean id="myClient" class="com.MyServiceClient"> 
    <property name="myService" ref="myService"/> 
</bean> 

的Java:

public interface IMyService { 
    Foo getFoo(); 
} 

public class MyServiceClient { 
    private IMyService myService; 
    public void setMyService(IMyService myService) { 
     this.myService = myService; 
    } 

    public void DoStuff() { 
     Foo foo = myService.getFoo(); 
     ... 
    } 
} 

對於自定義對象,你可能需要繼承JaxRpcPortProxyFactoryBean:

public class MyServiceFactoryBean extends JaxRpcPortProxyFactoryBean { 
protected void postProcessJaxRpcService(Service service) { 
    TypeMappingRegistry registry = service.getTypeMappingRegistry(); 
    TypeMapping mapping = registry.createTypeMapping(); 
      QName qName = new QName("http://com/myService", "Foo"); 
    mapping.register(Foo.class, qName, 
      new BeanSerializerFactory(Foo.class, qName), 
      new BeanDeserializerFactory(Foo.class, qName)); 
    } 
} 

我喜歡這個就是代碼不應該關心實施服務的服務不。測試變得輕而易舉,並且你的課堂的凝聚力是更好更好。

0

我們試圖使用複雜的對象和軸。別! Dotnet能夠從WSDL創建一個正確的對象,我們遇到了一堆問題。我們最終只使用了原語,字符串和數組。如果有人有一個使用複雜對象的好方法,我很樂意聽到它。

相關問題