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

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

到目前为止,我已经生成了信封和标题标记,但我在使用安全标记时遇到了问题。

我的问题是,如果我尝试将 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 标签应该如何构建?

包信息.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.*;

最佳答案

您可以在 Security 类之上使用 @XmlType(namespace="http://docs.oasis-open.org/wss") (或 XMLRoot),而不是在 package-info 中声明命名空间,它应该带来命名空间向下到安全标签。

正如评论中提到的,两个文档都是等效的 xml,因此首先测试 SOAP 消息是否按原样工作。如果另一方也能读取这个格式(任何像样的现代 WS 框架都可以),那么复制确切的格式就没有意义了。

关于java - JAXB - 如何仅在子标签中设置 xmlns 和前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28831508/

相关文章:

java - 我们可以使用 for-each 循环来迭代 Iterator 类型的对象吗?

java - CXF 忽略 WebParam 注释中的 header 参数

python - python 中的 SOAP 解决方案

java - 如何在Java中转换标签

java - JComboBox 是原始类型。对泛型类型 JComboBox<E> 的引用应该被参数化

java - 如何包装来自 Spring REST 存储库的 JSON 响应?

java - 无法使用 Java 的 JBMC(有界模型检查器)命令

java - ListView 项目中的图像未填充高度

java - 创建 xml 文档并添加或仅在文档存在时添加

c# - 如何将日期从 XML 序列化到 C#.NET