WSDL-Axis2 CodeGen问题

时间:2010-08-12 17:56:15

标签: java xml wsdl axis2

我在向服务器发送WS请求时遇到问题。似乎操作类型的一个ComplexType中的命名空间(NS)导致xsi:type作为生成的SOAP请求的一部分被激活。

请参阅下面的WSDL示例:

<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 Operation / Stub上生成请求的代码:

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;

每次发送请求时,都会收到以下错误消息:

  

接口参数错误:在元素SubscribeAppendantProductRequest中有1个XML验证错误:无效的xsi:type qname:'ns2:Product_type2'

请参阅下面的生成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>

我认为问题在于Product complex类型的基本扩展。

有趣的是,我在不同的操作类型上运行了类似的程序,具有相似的特性,运行正常。请参阅下面的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复杂类型作为扩展名。

有没有人有这方面的经验?任何可能的解决方如果我使用不同的数据绑定(来自ADB),情况会有所不同吗?

1 个答案:

答案 0 :(得分:0)

我最终决定对表示WSDL操作的Outputted Generated Java类使用'xmlbeans'数据绑定格式。

似乎Axis2数据绑定(ADB)不处理具有多个复杂类型的WSDL(当转换为Java代码时,返回Java对象),特别是如果它们配置了XMLSchema属性maxOccurs='unbounded'。 / p>

当使用ADB时生成输出时,似乎为每个名为Object的复杂类型创建一个单独的Object_x(其中x是1..n的整数),这将需要不同的属性,具体取决于定义的操作要求在WSDL文档中。 Object_x将与wsdl2java生成的其他对象放在同一个包中。然后,发送的SOAP请求包含一个type=Object_x XSD属性,伴随着Object对SOAP请求的转换,如初始问题所示。

当使用xmlbeans生成输出时,wsdl2java生成package.Object类,其中包是Operation的名称,而Object是Complex类型,似乎xmlbeans忽略maxOccurs='unbounded'属性并且发送的SOAP请求中没有放置任何类型参数。

这就是我解决这个问题的方法。我已经向Axis2开发团队发送了一个错误报告,但是我将继续关注它以确定未来版本中是否有任何解决方案。

感谢所有试过的人。