理解WSDL中的序列和返回数组

时间:2016-04-15 07:21:58

标签: java web-services soap wsdl axiom

因此我的Web服务应该采用一列数据(ID)并将相应数据的2列表返回到请求的ID。我明白我应该为此目的使用序列,所以我已经制定了这个模式:

<wsdl:types>
<xsd:schema targetNamespace="urn:myurn" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="GetWSIDListByDPIDList">
    <xsd:complexType>
        <xsd:sequence maxOccurs="unbounded" minOccurs="1">
            <xsd:element name="DPID" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
<xsd:element name="GetWSIDListByDPIDListResponse">
    <xsd:complexType>
        <xsd:sequence maxOccurs="unbounded" minOccurs="0">
            <xsd:element name="DP" type="xsd:string"/>
            <xsd:element name="WSID" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element></xsd:schema>

Request是一个字符串序列,response是一对字符串序列。似乎没错。

但是当我开始编写实现代码时(顺便说一下它是自上而下的方法)我意识到我需要某种第三个元素 - 行元素,包含2个字符串元素(DP和WSID),这是GetWSIDListByDPIDListRespose的子节点。

我正在使用Axiom编写实现,所以看起来像这样:

        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("urn:myurn", "urn");
        OMElement response = fac.createOMElement("GetWSIDListByDPIDListResponse",omNs);
        OMElement WSIDListItem = fac.createOMElement("WSIDListItem",omNs);
        OMElement WSID = fac.createOMElement("WSID",omNs);
        WSID.addChild(fac.createOMText("0123123"));
        OMElement DP = fac.createOMElement("DP",omNs);
        DP.addChild(fac.createOMText("0321321"));
        WSIDListItem.addChild(DP);
        WSIDListItem.addChild(WSID);
        response.addChild(WSIDListItem);
        return response;

最后我得到了这样的回应:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:GetWSIDListByDPIDListResponse xmlns:urn="urn:fnc.service.livelink.opentext.com">
         <urn:WSIDListItem>
            <urn:DP>0321321</urn:DP>
            <urn:WSID>0123123</urn:WSID>
         </urn:WSIDListItem>
      </urn:GetWSIDListByDPIDListResponse>
   </soapenv:Body>
</soapenv:Envelope>

因此,为响应添加更多WSIDListItem,我会得到一些像表格的东西。但是看起来不像WSDL中描述的那样。我甚至不理解使用我的wsdl描述会有什么反应。

所以问题是返回2列数据的正确方法是什么?我的方法是否正确?我应该修复什么,实现或WSDL来匹配我的实现?

提前致谢。

1 个答案:

答案 0 :(得分:0)

好的,所以我有点自己回答了我的问题。响应,匹配我的WSDL看起来像

f1<int>(1, 2); // ill-formed?
f2<int>(1, 2); // ill-formed?

这对于眼睛来说是一种误导。所以我决定更好的决定是改变wsdl响应模式并将DPID作为属性和值返回,如下所示:

  <urn:GetWSIDListByDPIDList>
     <DP>1</DP>
     <WSID>2</WSID>
     <DP>3</DP>
     <WSID>4</WSID>
  </urn:GetWSIDListByDPIDList>

同事提出了另一种方法:

<WSID DPID="Some ID">1</WSID>