如果标签上没有 ns2:,则无法读取 SOAP 信息。为什么?

Can't read the SOAP information without the ns2: on the tag. Why?

我正在尝试从 SOAP 调用中接收一些信息。我的端点调用成功,但是我的类里面的信息是null。我只有把<XYZFullDesc/<order_no>改成<ns2:XYZFullDesc/<ns2:order_no>才能收到信息,但是我需要收到XML 没有任何变化.

我的 Soap 服务需要接收的整个 XML:

<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>

我的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 的 presence/absence 来解释这种行为呢?上面的XML不做任何改动怎么读?

我最终得到了以下解决方案。

因为我想在同一个架构上有两个名称空间,以便理解阅读相关主题,import 在我的 XSD 上是必需的。我最初的想法是设置不同的命名空间,但我只能为PublishXYZFullModifyUsingXYZFullDesc设置一个命名空间,并使XYZFullDesc的命名空间被忽略(不为空,什么是无效的),使用

主要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;

}