JAXB - 如何仅在子标记中设置xmlns和前缀

时间:2015-03-03 12:10:20

标签: java xml soap jaxb

我使用JAXB生成soap xml请求。我想要的当前xml输出是这个

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

到目前为止,我已经生成了Envelope和Header标签,但我遇到了安全标签问题。

我的问题是,如果我尝试将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 个答案:

答案 0 :(得分:1)

您可以在Security类之上使用@XmlType(namespace =&#34; http://docs.oasis-open.org/wss")(或XMLRoot),而不是在package-info中声明命名空间它应该将命名空间降低到安全标记。

如评论中所提到的,两个文档都是等效的xml,因此首先测试soap消息是否正常工作。如果对方也可以阅读这个格式,那么重现精确格式就没有意义(任何体面的现代WS框架都可以)。