我正在使用 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:wsse
和 xmlns: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/