我正在使用CXF JAXWS客户端从外部Web服务中检索一些信息。所以,基本上,我们从外部获得.xsd和.wsdl文件,并尝试通过使用cxf-codegen-plugin生成客户端存根来实现我们的ws使用者。我们无法更改.xsd和.wsdl文件。一切正常,我们能够从外部服务发送和检索肥皂消息。 但是,当我查看日志中的soap请求消息时,我发现从我们的ws客户端发送的soap(body)消息中有很多未使用的命名空间。 以下是一个例子
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:aheaderns="http://xxx.xxx.xxx.xxx/header.xsd">
<soap:Header>
...
</soap:Header>
<soap:Body>
<ns7:requestQuery xmlns:ns15="http://xxx.xxx.xxx.xxx/AAA" xmlns:ns14="http://xxx.xxx.xxx.xxx/BBB" xmlns:ns13="http://xxx.xxx.xxx.xxx/DDD" xmlns:ns12="http://xxx.xxx.xxx.xxx/CCC" xmlns:ns11="http://xxx.xxx.xxx.xxx/EEE" xmlns:ns10="http://xxx.xxx.xxx.xxx/FFF" xmlns:ns9="http://xxx.xxx.xxx.xxx/GGG" xmlns:ns8="http://xxx.xxx.xxx.xxx/HHH" xmlns:ns7="http://xxx.xxx.xxx.xxx/III" xmlns:ns6="http://xxx.xxx.xxx.xxx/JJJ" xmlns:ns5="http://xxx.xxx.xxx.xxx/KKK">
<ns7:sample>
<ns7:type>A</ns7:type>
<ns7:ref>1</ns7:ref>
</ns7:sample>
</ns7:requestQuery>
</soap:Body>
有没有办法从客户端发送的出站soap消息中删除未使用的命名空间?
答案 0 :(得分:2)
您可以将客户端代理类移动到同一个包中,并将其映射到wsdl中指定的建议命名空间。 将此代码放入package-info.java类:
@XmlSchema(xmlns = { @XmlNs(prefix = "ns1", namespaceURI = "http://xxx.xxx.xxx") },
namespace = "http://xxx.xxx.xxx")
package clinet.sample.proxy;
import javax.xml.bind.annotation.XmlNs;
希望这有帮助。
答案 1 :(得分:0)
在深入研究这个问题很长一段时间后,我找到了解决方案。但是,我认为我的解决方案不是从根本上解决问题,而是现在可以使用。
基本上,我使用CXF的XSLTOutInterceptor将XSL应用于out消息。但是,默认的PRE_STEAM阶段对我不起作用。然后,我决定扩展XSLTOutInterceptor,以便将其PHASE更改为WRITE。因此,在发送协议消息之前,将删除未使用的命名空间。
我使用的XSL来自how to remove unused namespaces from source xml
顺便说一句,我仍然不知道为什么生成那些未使用的命名空间。如果有人能给我一个建议,我将不胜感激。
谢谢:)