5

我正在使用 CXF JAXWS 客户端从外部 Web 服务中检索一些信息。所以,基本上,我们有来自外部的 .xsd 和 .wsdl 文件,并尝试通过使用 cxf-codegen-plugin 生成客户端存根来实现我们的 ws 消费者。我们无法更改 .xsd 和 .wsdl 文件。一切正常,我们能够从外部服务发送和检索肥皂消息。但是,当我从日志中查看soap 请求消息时,我发现从我们的ws 客户端发送的soap(正文)消息中有很多未使用的命名空间。下面是一个例子

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

有没有办法从客户端发送的出站肥皂消息中删除未使用的命名空间?

4

2 回答 2

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;

希望这可以帮助。

于 2013-09-16T07:49:18.307 回答
0

在深入研究这个问题一段时间后,我找到了解决方案。但是,我认为我的解决方案不是从根本上解决问题,而是暂时有效。

基本上,我使用 CXF 中的 XSLTOutInterceptor 将 XSL 应用于输出消息。但是,默认的 PRE_STEAM 阶段对我不起作用。然后,我决定扩展 XSLTOutInterceptor 以将其 PHASE 更改为 WRITE。因此,未使用的命名空间将在协议消息的编写过程中被删除,然后再发送出去。

我使用的 XSL 来自如何从源 xml 中删除未使用的命名空间

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

谢谢 :)

于 2013-09-18T09:43:10.777 回答