2015-05-09 3 views
0

Я пытаюсь создать новую версию сервера, который ранее использовал Axis 1.4 для ответа на запросы SOAP RPC с использованием Spring-WS. У меня есть несколько вызовов RPC рабочих, но я застрял, пытаясь удовлетворить запрос, который ожидает тело SOAP, который выглядит следующим образом:Поддержка JAXB для типа SOAP 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 для использования/набора аннотаций для правильной работы с маршалом (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> 
Смежные вопросы