簡體   English   中英

沒有命名空間的 SOAP 響應(Spring Boot)

[英]SOAP without namespace in response (Spring Boot)

我正在按照此示例使用 Soap 構建 Web 服務。 有沒有辦法刪除 Soap 響應的 targetNamespace? 使用 SoapUI 我得到這樣的回應:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
 <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
   <ns2:getAllResponse xmlns:ns2="http://spring.io/guides/gs-producing-web-service">
    <ns2:timestamp>12/18/2015 10:51:02 AM</ns2:timestamp>
    <ns2:MyItem>
       <ns2:class>myClass</ns2:class>
       <ns2:name>MyItemName</ns2:name>
    </ns2:MyItem>
  </ns2:getAllResponse>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

並希望在沒有目標命名空間的情況下獲得它,例如:

...    
<MyItem>
<MyItem>
       <class>myClass</class>
       <name>MyItemName</name>
</MyItem>

我正在發送一個空請求以獲取 MyItems 列表。 我的 xsd 看起來像這樣:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
xmlns:tns="http://spring.io/guides/gs-producing-web-service"     
targetNamespace="http://spring.io/guides/gs-producing-web-service">

 <xs:element name="getAllRequest">
    <xs:complexType>
        <xs:sequence>
        </xs:sequence>
    </xs:complexType>
 </xs:element>

 <xs:element name="getAllResponse">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="1" name="timestamp" type="xs:string"/>
            <xs:element maxOccurs="unbounded" name="MyItem" type="tns:MyItem"/>
        </xs:sequence>
    </xs:complexType>
 </xs:element>   

 <xs:complexType name="MyItem">
    <xs:sequence>
        <xs:element name="class" type="xs:string"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
 </xs:complexType>
</xs:schema>

MyItem 類將自動生成並使用以下注釋:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MyItem", propOrder = {
   "class",
   "name",
})
public class MyItem { //....

有沒有辦法在沒有目標命名空間的情況下獲得響應? 我知道它的目的,而且它實際上非常有用。 但碰巧的是,它無法被具有此目標命名空間的另一個工具進一步處理,如下所示:

<MyItem xmlns="http://spring.io/guides/gs-producing-web-service"> ...

提前致謝!

有沒有辦法在沒有目標命名空間的情況下獲得響應?

我希望不是。 SOAP Web 服務應該有一個定義良好的、已發布的接口,並且它發送的每個響應都應該符合該接口。 通常,接口由 WSDL 文檔描述。

並希望在沒有目標命名空間的情況下獲得它

<MyItem>
   <class>myClass</class>
   <name>MyItemName</name>
</MyItem>

迂腐,但沒有命名空間前綴並不意味着沒有命名空間。 可能存在有效的默認命名空間。 因此,您可以實現與上述完全一樣的 XML,並且 MyItem、類和名稱標簽可能仍然具有非空的命名空間。

我知道它的目的,而且它實際上非常有用。

XML 文檔中的命名空間(無論是 Web 服務響應還是任何其他 XML)的目的是避免污染全局命名空間。 您真的希望“名稱”和“班級”在您的應用程序中只有一個含義嗎? 或者如果每個模式都可以定義自己的版本會更好嗎?

但碰巧的是,它無法被具有此目標命名空間的另一個工具進一步處理,如下所示:

<MyItem xmlns="http://spring.io/guides/gs-producing-web-service"> ...

這看起來像是有效的 XML,那么有什么問題呢? 該輸出是由“其他工具”產生的嗎? 還是“其他工具”無法處理的事情?

這是針對該問題的簡單且最簡單的解決方案。 在您的模型包中創建 Package-Info.Java 文件並將以下腳本添加到該文件中。

@javax.xml.bind.annotation.XmlSchema(namespace = "http://spring.io/guides/gs-producing-web-service", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://spring.io/guides/gs-producing-web-service", prefix = "") })
package my.com.scicom.stars.model;

並在您的 xsd 或 wsdl 文件中將 elementFormDefault 添加為“合格”。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://spring.io/guides/gs-producing-web-service"
           targetNamespace="http://spring.io/guides/gs-producing-web-service"
           elementFormDefault="qualified">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM