【问题标题】:WSDL-Axis2 CodeGen ProblemWSDL-Axis2 CodeGen 问题
【发布时间】:2010-09-01 20:20:08
【问题描述】:

我在向服务器发送 WS 请求时遇到问题。似乎某个操作类型的 ComplexTypes 中的命名空间 (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;

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

接口参数错误:有 1 个 XML 验证错误:Invalid xsi:type qname: 'ns2:Product_type2' in element 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>

我认为问题出在 Product 复杂类型的基本扩展上。

有趣的是,我在具有相似特征的不同操作类型上运行了一个类似的程序,它运行良好。功能操作的 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),情况会有所不同吗?

【问题讨论】:

    标签: java xml wsdl axis2


    【解决方案1】:

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

    似乎 Axis2 数据绑定 (ADB) 无法处理具有多种复杂类型的 WSDL(这些复杂类型在转换为 Java 代码时返回 Java 对象),尤其是当它们配置有 XMLSchema 属性 maxOccurs='unbounded' 时。

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

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

    这就是我解决这个问题的方法。我已经向 Axis2 开发团队发送了错误报告,但我会继续跟进,看看在未来的版本中是否有任何解决方案。

    感谢所有尝试过的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2021-04-26
      • 1970-01-01
      相关资源
      最近更新 更多