2015-12-18 32 views
2

我正在關注example以構建帶Soap的Web服務。有沒有辦法去除Soap響應的targetNamespace?隨着SoapUI我得到這個迴應:沒有命名空間的SOAP響應(Spring Boot)

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

在此先感謝!

+0

然後你的其他工具有問題。一個工具如何知道它的結構並不知道首先定義文檔結構的名稱空間。 –

+0

好的。所以你的回答是,這根本不可能? – Lyn

+0

JAXB自動包含名稱空間,它不會執行任何在正常XML中不允許的操作。那麼爲什麼你的其他工具不只是表示xml? –

回答

2

有沒有辦法得到沒有目標名稱空間的響應?

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

,並希望得到它沒有目標命名空間

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

不是學究氣十足,但由於沒有一個命名空間前綴並不意味着沒有命名空間。可能有一個默認的命名空間正在生效。所以你可能實現的XML看起來和上面完全一樣,而MyItem,class和name標籤可能仍然有一個非空的名字空間。

我知道它的目的,它確實非常有用。

XML文檔中的命名空間(無論是Web服務響應還是任何其他XML)的目的是爲了避免污染全局名稱空間。你真的想要'名字'和'班'在你的應用程序中有一個意義嗎?或者,如果每個模式都可以定義它們自己的版本,會更好嗎?

但是它發生了,它不能被任何進一步與這個目標命名空間處理的另一種工具,看起來像這樣:

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

這看起來像有效的XML,所以有什麼問題呢?這是'其他工具'產生的輸出嗎?還是「其他工具」無法處理?

+0

我想我很困惑,沒有正確解釋。我只是不希望名稱空間顯示爲前綴。謝謝你的幫助。如果任何人有同樣的問題,只需將其添加到您的xsd:xs:schema attributeFormDefault =「unqualified」elementFormDefault =「unqualified」 – Lyn