XmlAnyElement lax = true любой объект возвращает список в интерфейсе SOAP, но при использовании службы в JAVA получают только последний объект.

Я ожидаю список в ответ, но я получаю только последний ожидаемый элемент из списка. что я могу делать не так?

WSDL часть:

<s:element name="delTrackLogsResponse">
    <s:complexType>
        <s:sequence>
            <s:element maxOccurs="1" minOccurs="1" name="returnDocument" type="tns:Element"/>
        </s:sequence>
   </s:complexType>
</s:element>
<s:complexType name="Element">
    <s:sequence>
        <s:any processContents="lax"/>
    </s:sequence>
</s:complexType>

Классы, сгенерированные bu wsdl2java:

public class DelTrackLogsResponse {

    @XmlElement(required = true)
    protected Element returnDocument;
//followed by getters setters
}

public class Element {

    @XmlAnyElement(lax = true)
    protected Object any;
//followed by getters setters
}

Мой звонок в сервис:

response.setReturnDocument(cdCommunicationLogSession().delTrackLogs(parameters);

Я собираю объект ответа для просмотра ответа:

StringWriter stringWriter = new StringWriter();

JAXBContext jaxbContext = JAXBContext.newInstance(cd.communicationlog.Element.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

// format the XML output
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

QName qName = new QName("cd.communicationlog", "trackLogsResponse");
JAXBElement<DelTrackLogsResponse> root = new JAXBElement<DelTrackLogsResponse>(qName,DelTrackLogsResponse.class, response);

jaxbMarshaller.marshal(root, stringWriter);

String result = stringWriter.toString();
log.debug("---- result xml: " + result);

Результат XML я получаю:

<ns2:trackLogsResponse xmlns:ns2="com.sample.jaxb.model" xmlns="urn:cd:communicationLog">
    <returnDocument>
        <element clickFlag="0" deliveryDate="2017-02-23" deliveryLabel="xyz" deliveryType="Email" firstLogDate="N/A" openFlag="0"/>
    </returnDocument>
</ns2:trackLogsResponse>

Где, когда я запускаю то же самое в SOAP UI, я получаю список в ответ, например:

 <delTrackLogsResponse SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns="urn:cd:communicationLog">
         <returnDocument xsi:type="ns:Element" SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
            <element deliveryLabel="abc" deliveryDate="2017-03-20" deliveryType="Email" firstLogDate="N/A" openFlag="0" clickFlag="0"/>
            <element deliveryLabel="abc" deliveryDate="2017-03-20" deliveryType="Email" firstLogDate="N/A" openFlag="0" clickFlag="0"/>
           .
           .
           .
           .
            <element deliveryLabel="xyz" deliveryDate="2017-02-23" deliveryType="Email" firstLogDate="N/A" openFlag="0" clickFlag="0"/>
            <element deliveryLabel="xyz" deliveryDate="2017-02-23" deliveryType="Email" firstLogDate="N/A" openFlag="0" clickFlag="0"/>
         </returnDocument>
 </delTrackLogsResponse>

Заранее спасибо:)

1 ответ

Решение

Вот что я изменил в wsdl:

<s:complexType name="Element">
       <s:sequence>
             <s:any processContents="lax" maxOccurs="unbounded" minOccurs="1"/>
       </s:sequence>
</s:complexType>

Работает нормально сейчас.

Другие вопросы по тегам