Не могу прочитать информацию SOAP без тега ns2 :. Зачем? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь получить некоторую информацию от вызова SOAP. Моя конечная точка успешно вызывается, но информация внутри моих классов null. Я могу получить информацию, только если я изменю <XYZFullDesc / <order_no> на <ns2:XYZFullDesc / <ns2:order_no>, но мне нужно получить XML без каких-либо изменений .

Весь XML, который должен получить мой сервис Soap:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Header/>
   <S:Body>
      <ns2:publishXYZFullModifyUsingXYZFullDesc xmlns:ns2="http://www.oracle.com/retail/igsla/integration/services/XYZFullPublishingService/v1">
         <XYZFullDesc xmlns="http://www.oracle.com/retail/integration/base/bo/XYZFullDesc/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <order_no>2445460</order_no>
         </XYZFullDesc>
       </ns2:publishXYZFullModifyUsingXYZFullDesc>
   </S:Body>
</S:Envelope>

Мой текущий XSD:

<s:schema xmlns:s="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://www.oracle.com/retail/igsla/integration/services/XYZFullPublishingService/v1"
           targetNamespace="http://www.oracle.com/retail/igsla/integration/services/XYZFullPublishingService/v1"
          elementFormDefault="qualified">

    <s:element name="publishXYZFullModifyUsingXYZFullDesc">
        <s:complexType>
            <s:sequence>
                <s:element name="XYZFullDesc" type="tns:XYZFullDesc"/>
            </s:sequence>
        </s:complexType>
    </s:element>

    <s:complexType name="XYZFullDesc">
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="order_no" type="s:string"/>
        </s:sequence>
    </s:complexType>

</s:schema>

Конечная точка My Spring:

private static final String NAMESPACE_URI = "http://www.oracle.com/retail/igsla/integration/services/XYZFullPublishingService/v1";

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "publishXYZFullModifyUsingXYZFullDesc")
@ResponsePayload
public void receberPedidoRequest(@RequestPayload PublishXYZFullModifyUsingXYZFullDesc request) {
    // code...
}

Так что же объясняет такое поведение наличием / отсутствием ns2? Как читать приведенный выше XML без каких-либо изменений?

1 Ответ

0 голосов
/ 08 января 2019

Я получаю следующее решение.

Так как я хотел бы иметь два пространства имен в одной и той же схеме, чтобы понять чтение по теме, import было необходимо на моем XSD. Моя первоначальная идея заключалась в том, чтобы установить разные пространства имен, но я мог установить пространство имен только для PublishXYZFullModifyUsingXYZFullDesc и заставить игнорировать пространство имен для XYZFullDesc (не пустое, что считается недействительным), используя ref .

Основной XSD:

<s:schema xmlns:s="http://www.w3.org/2001/XMLSchema"
           xmlns:po="http://www.oracle.com/retail/integration/base/bo/XYZFullDesc/v1"
           targetNamespace="http://www.oracle.com/retail/abcd/integration/services/XYZFullPublishingService/v1"
          elementFormDefault="qualified">

    <s:import schemaLocation="po.xsd"
               namespace="http://www.oracle.com/retail/integration/base/bo/XYZFullDesc/v1" />

    <s:element name="publishXYZFullModifyUsingXYZFullDesc">
        <s:complexType>
            <s:sequence>
                <s:element ref="po:XYZFullDesc"/>
            </s:sequence>
        </s:complexType>
    </s:element>

</s:schema>

Импортированный файл po.xsd:

<?xml version="1.0" encoding="utf-16" ?>
<s:schema targetNamespace="http://www.oracle.com/retail/integration/base/bo/XYZFullDesc/v1"
           xmlns:s="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.oracle.com/retail/integration/base/bo/XYZFullDesc/v1"
           elementFormDefault="qualified">

    <s:element name="XYZFullDesc" type="XYZFullDesc"/>

    <s:complexType name="XYZFullDesc">
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="order_no" type="s:string"/>
        </s:sequence>
    </s:complexType>

</s:schema>

Сгенерированные заглушки Java:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "xyzFullDesc"
})
@XmlRootElement(name = "publishXYZFullModifyUsingXYZFullDesc", namespace = "http://www.oracle.com/retail/abcd/integration/services/XYZFullPublishingService/v1")
public class PublishXYZFullModifyUsingXYZFullDesc {

    @XmlElement(name = "XYZFullDesc", required = true) // no namespace, but works for me
    protected XYZFullDesc xyzFullDesc;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...