2010-08-12 101 views
0

我在向服務器發送WS請求時遇到問題。似乎某個操作類型的其中一個ComplexType中的名稱空間(NS)導致xsi:type作爲生成的SOAP請求的一部分進行傳播。WSDL-Axis2 CodeGen問題

請參閱下面的WSDL示例:

SubscribeAppendantProductRequest sub_req = new SubscribeAppendantProductRequest();
Product_type2 subscribedToProduct = new Product_type2();
subscribedToProduct.setId(productKey);
subscribedToProduct.setValidMode(ValidMode.value1);
Product_type2 []subscribedProductList = new Product_type2[1];
subscribedProductList[0]=subscribedToProduct;
sub_req.addProduct(subscribedToProduct);
sub_req.setProduct(subscribedProductList);
sub_req.setSubscriberNo(subscriber);
return sub_req;

每次我發送一個請求:

<xs:complexType name="SubscribeAppendantProductRequest">
<xs:complexContent>
<xs:extension base="business:Common">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Product">
<xs:complexType>
<xs:complexContent>
<xs:extension base="business:Product">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="Service" type="business:Service" />
<xs:element minOccurs="0" name="EffectiveDate" type="xs:string" />
<xs:element minOccurs="0" name="ExpireDate" type="xs:string" />
<xs:element name="ValidMode" type="business:ValidMode" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="HandlingChargeFlag" type="xs:int" />
<xs:element minOccurs="0" name="CustID" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

的代碼生成的Axis2的操作/存根要求,請參閱下文,我收到以下錯誤消息:

接口參數故障:具有1個XML驗證錯誤:無效的xsi:QName類型: 'NS2:Product_type2' 在元件SubscribeAppendantProductRequest

查看下列生成的SOAP請求:

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<ns3:SubscribeAppendantProductRequestMsg xmlns:ns3="http://www.huawei.com/bme/cbsinterface/cbs/businessmgrmsg">
<RequestHeader>
<ns1:CommandId xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">SubscribeAppendantProduct</ns1:CommandId>
<ns1:Version xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">1.0</ns1:Version>
<ns1:TransactionId xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">trans001</ns1:TransactionId>
<ns1:SequenceId xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">2002396871686</ns1:SequenceId>
<ns1:RequestType xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">Event</ns1:RequestType>
<ns1:SerialNo xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">2002396871686</ns1:SerialNo>
</RequestHeader>
<SubscribeAppendantProductRequest xmlns:ns2="http://www.huawei.com/bme/cbsinterface/cbs/businessmgr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubscribeAppendantProductRequest">
<ns2:SubscriberNo>8090547759</ns2:SubscriberNo>
<ns2:Product xsi:type="ns2:Product_type2">
<ns2:Id>121390</ns2:Id>
<ns2:ValidMode>4050000</ns2:ValidMode>
</ns2:Product>
</SubscribeAppendantProductRequest>
</ns3:SubscribeAppendantProductRequestMsg>
</soapenv:Body>
</soapenv:Envelope>

相信問題在於產品複雜類型的基本擴展。有趣的是,我已經運行了一個類似的程序,在不同的操作類型上有相似的特徵,這些類型的特徵工作正常。請參閱下面的功能操作的WSDL樣本:

<xs:complexType name="UnSubscribeAppendantProductRequest">
<xs:complexContent>
<xs:extension base="business:Common">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Product">
<xs:complexType>
<xs:sequence>
<xs:element name="ProductID" type="xs:string" />
<xs:element minOccurs="0" name="ProductOrderKey" type="xs:string" />
<xs:element name="ValidMode" type="xs:string" />
<xs:element minOccurs="0" name="ExpireDate" type="xs:string" />
<xs:element maxOccurs="unbounded" minOccurs="0" name="Service">
<xs:complexType>
<xs:sequence>
<xs:element name="Id" type="xs:string" />
<xs:element maxOccurs="unbounded" name="SimpleProperty" type="business:SimpleProperty" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="CustID" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

當我做了一個比較,似乎他們都使用Product複雜的類型,但它似乎是錯誤的使用Product複雜類型的擴展。

有沒有人有這方面的經驗?任何可能的解如果我使用不同的數據綁定(來自亞行),情況會不同嗎?

回答

0

我最終決定爲表示WSDL操作的Outputted Generated Java類使用'xmlbeans'數據綁定格式。

似乎Axis2數據綁定(ADB)不處理具有多個複雜類型(當轉換爲Java代碼時返回Java對象)的WSDL,特別是如果它們使用XMLSchema屬性maxOccurs='unbounded'進行配置。

當使用ADB生成輸出時,爲每個稱爲對象的複雜類型創建一個單獨的Object_x(其中x是範圍從1..n的整數),這將根據操作要求而需要不同的屬性,如在WSDL文檔中定義。 Object_x將放置在與wsdl2java生成的其他對象相同的包中。發送的SOAP請求包含一個type=Object_x XSD屬性,伴隨着將對象轉換爲SOAP請求,如初始問題所示。

當使用xmlbeans生成輸出時,package.Object類由wsdl2java生成,其中包是Operation的名稱,而Object是Complex類型,似乎xmlbeans忽略maxOccurs='unbounded'屬性,發送的SOAP請求沒有放置任何類型參數。

那麼這是我如何解決這個問題。我已經向Axis2開發團隊發送了一個錯誤報告,但我會繼續跟進,看看未來版本中是否有任何解決方案。

感謝所有試過的人。