2015-05-09 79 views
0

我在試圖製作一個服務器的新版本,該版本以前使用Axis 1.4來使用Spring-WS響應SOAP RPC請求。我有幾個RPC調用的工作,但我堅持試圖滿足期望一個SOAP體,看起來像這樣的請求:對SOAP樣式的JAXB支持arrayType

<rpcCallResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <responseElement soapenc:arrayType="xsd:string[5]" 
     xsi:type="soapenc:Array" 
     xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> 
     <responseElement xsi:type="xsd:string">val1</responseElement> 
     <responseElement xsi:type="xsd:string">val2</responseElement> 
     <responseElement xsi:type="xsd:string">val3</responseElement> 
     <responseElement xsi:type="xsd:string" xsi:nil="true"/> 
     <responseElement xsi:type="xsd:string" xsi:nil="true"/> 
    </responseElement> 
</rpcCallResponse> 

我掙扎爲此編寫的XML模式,並讓JAXB編組人員將xsi:type註釋插入到響應中。

什麼是正確的XML模式使用/註釋集用於使其正確地使用marhsal(Java - > XML)?

回答

0

一個解決方案,我發現,用來獲取添加的arrayType中的工作原理是,而不是從http://schemas.xmlsoap.org/soap/encoding/架構派生,使用形式的自定義模式:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://schemas.xmlsoap.org/soap/encoding/" 
    elementFormDefault="qualified"> 
    <xs:attribute name="arrayType" type="xs:QName" /> 
</xs:schema> 

...它取代的類型arrayType屬性與xs:QName(與實際類型,這只是一個xs:string)。使用QName的好處似乎是,JAXB會在發生序列化時將QName的名稱空間推送到元素上 - 這是上面獲取工作模式的主要障礙。

上面的模式現在看起來是這樣的:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:encoding="http://schemas.xmlsoap.org/soap/encoding/" 
    targetNamespace="http://foo.com/bar" 
    elementFormDefault="qualified"> 

    <xs:import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="soapenc.xsd" /> 

    <xs:element name="rpcCallResponse"> 
     <xs:complexType> 
      <xs:element name="responseElement"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="responseElement" maxOccurs="5" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:attribute ref="soapenc:arrayType" /> 
     </xs:complexType> 
    </xs:element> 
</xs:schema>