在 JAX-WS 中是否可以生成 xmlns 属性而不是前缀?
示例:包 myns.a 中的对象 A 包含包 myns.b 中的一些对象 B1、B2。生成的 SOAP 消息:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="urn:myns/a" xmlns:b="urn:myns/b">
<soapenv:Header/>
<soapenv:Body>
<a:A1>
<b:B1>123456</b:B1>
<b:B2>abc</b:B2>
</a:A1>
</soapenv:Body>
</soapenv:Envelope>
但是,我需要以这种方式生成它(因此应该删除前缀 b,并且包 myns.b 中的所有对象都应该具有 xmlns 属性):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="urn:myns/a">
<soapenv:Header/>
<soapenv:Body>
<a:A1>
<B1 xmlns="urn:myns/b">123456</B1>
<B2 xmlns="urn:myns/b">abc</B2>
</a:A1>
</soapenv:Body>
</soapenv:Envelope>
有没有简单的方法,如何处理这个问题?例如在 package-info.java 级别?
最佳答案
我使用自定义 SOAPHandler 并从 urn:myns/b 命名空间中的元素中删除前缀解决了这个问题。
简化片段:
@Override
public boolean handleMessage(SOAPMessageContext context) {
SOAPBody body = context.getMessage().getSOAPPart().getEnvelope().getBody();
//do recursivelly, this is just example
Iterator iter = body.getChildElements();
while (iter.hasNext()) {
Object object = iter.next();
if (object instanceof SOAPElement) {
SOAPElement element = (SOAPElement) object;
if("urn:myns/b".equals(element.getNamespaceURI())){
element.setPrefix("");
}
}
}
关于java - 属性中的 JAX-WS 命名空间,而不是前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35382457/