2015-03-03 186 views
0

我正在使用JAXB生成soap xml請求。目前我想要的xml輸出是這樣的JAXB - 如何在子標記中設置xmlns和前綴

<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:rgw="http:/blablablablabla.org" 
xmlns:typ="http://blablablablabla.org/bla/bla"> 

<soapenv:Header> 

    <wsse:Security 
    soapenv:mustUnderstand="1" 
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 

     <wsse:UsernameToken wsu:Id="testToken-13"> 
     <wsse:Username>blbalbalL</wsse:Username> 
     <wsse:Password 
     Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">1234r</wsse:Password> 
    </wsse:UsernameToken> 
    </wsse:Security> 
</soapenv:Header> 
<soapenv:Body> 
</soapenv:Body> 
</soapenv:Envelope> 

直到現在我已經生成了信封和標頭標籤,但是我有安全標籤的問題。

我的問題是,如果我嘗試將xmlns設置爲package-info.class,則前綴正確,但xmlns:wsse="blbalbla"xmlns:wsu="http://balbla.com"將轉到根元素(信封),而不是轉到安全標記中。下面是我得到的輸出:

<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:rgw="http://gr/gsis/rgwsalldata/RgWsAllData.wsdl" 
xmlns:typ="http://gr/gsis/rgwsalldata/RgWsAllData.wsdl/types/" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
<soapenv:Header> 
    <wsse:Security/> 
</soapenv:Header> 
<soapenv:Body/> 

正如你可以在慾望XML輸出xmlns:wssexmlns:wsu名字空間在安全標籤看到。我怎麼能這些xmlns安全標籤?以及UsernameToken標籤應該如何構建?

包info.class

@XmlSchema(
    namespace = "http://schemas.xmlsoap.org/soap/envelope/", 
    xmlns = { @XmlNs(prefix="soapenv", namespaceURI="http://schemas.xmlsoap.org/soap/envelope/"), 
       @XmlNs(prefix="rgw", namespaceURI="http://blabalbalbal.org"), 
       @XmlNs(prefix="typ", namespaceURI="blablaba/types/"), 
       @XmlNs(prefix="wsse", namespaceURI="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"), 
       @XmlNs(prefix="wsu", namespaceURI="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")}, 
    elementFormDefault = XmlNsForm.QUALIFIED) 

package broker.jaxb.xmlrequest; 

import javax.xml.bind.annotation.*; 
+1

爲什麼要移動命名空間聲明? XML文檔是等效的。 – 2015-03-03 12:27:32

+0

@BlaiseDoughan我沒有很多jaxb和xml文件的經驗,我想移動命名空間聲明inorder生成完全相同的soap xml請求,以便我可以確定我不會得到任何由命名空間造成的錯誤。 – fnkbz 2015-03-03 12:39:19

回答

1

您可以使用@XmlType空間(namespace = 「http://docs.oasis-open.org/wss」)對安全類的頂部(或XMLRoot)代替在package-info中聲明名稱空間,它應該把名稱空間放到Security標籤中。

正如評論中提到的,兩個文檔都是等價的xml,所以首先測試soap消息是否按原樣運行。如果另一方也可以閱讀這個格式(沒有任何體面的現代WS框架可以),那麼沒有意義重現確切的格式。

+0

intresting,但我不能有這樣的期望的前綴。我在Security的每個子標籤上都會得到一個ns5前綴。 '@XmlType(name =「Security」,namespace =「http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd」) public class Security '並且它不會將名稱空間帶到securty標記 – fnkbz 2015-03-03 13:09:06

+0

謝謝!只要它們是相等的,我將離開命名空間。 – fnkbz 2015-03-03 13:17:08

+0

如果這樣做「有效」,這是一種僥倖,因爲這不是'@ XmlType'註釋是如何解釋的。 – 2015-03-03 16:09:27

相關問題