我有类似这样的SOAP请求:
<SOAP-ENV:Envelope>
<SOAP-ENV:Header>
....
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<MyRequest>
<Param>3</Param>
</MyRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
并且响应应该像
<SOAP-ENV:Envelope>
<SOAP-ENV:Header>
....
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<MyResponse>
<Value>3234</Value>
<Value>542</Value>
</MyResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我的问题是我的JAX-WS SOAP服务需要一个命名空间,例如的xmlns =&#34; HTTP://myapp.example.com"在MyRequest
。它还将此命名空间添加到MyResponse
元素。
我设法编写了一个拦截器,如果它是空白的,它会将我的应用目标命名空间添加到请求消息中。这很好。
我现在的问题是我不知道如何从响应消息中删除此命名空间。
我知道最好的解决方案是让客户端使用命名空间,但是在我正在处理的项目中这是不可能的。
答案 0 :(得分:0)
CXF附带转换功能,请看here
页面中的样本bean提取。
<bean id="transformFeature" class="org.apache.cxf.feature.StaxTransformFeature">
<property name="outTransformElements">
<map>
<!-- change "book" to "thebook" -->
<entry key="book" value="thebook"/>
<!-- drop the namespace from "book" -->
<entry key="{http://books}book" value="book"/>
<!-- qualify "book" with "http://books" -->
<entry key="book" value="{http://books}thebook"/>
<!-- change namespace to "http://books" for all the elements with the "http://book" namespace -->
<entry key="{http://book}*" value="{http://books}*"/>
</map>
</property>
</bean>
答案 1 :(得分:-1)
由于我们不知道您使用的是什么,因此非常广泛,但如果您可以使用Metro(JAX-WS),那么您可以利用他们所谓的 SOAPMessage Handler (看看here)。它的工作方式非常类似于Servlet过滤器组件。
拥有implements SOAPHandler<SOAPMessageContext>
并删除那里的命名空间声明。