从soap body消息中删除出站未使用的命名空间

时间:2013-09-16 05:35:29

标签: web-services soap namespaces cxf

我正在使用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消息中删除未使用的命名空间?

2 个答案:

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

顺便说一句,我仍然不知道为什么生成那些未使用的命名空间。如果有人能给我一个建议,我将不胜感激。

谢谢:)