从SOAP请求和响应中删除命名空间

时间:2016-11-29 21:47:10

标签: java soap cxf jax-ws

我有类似这样的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元素。

我设法编写了一个拦截器,如果它是空白的,它会将我的应用目标命名空间添加到请求消息中。这很好。

我现在的问题是我不知道如何从响应消息中删除此命名空间。

我知道最好的解决方案是让客户端使用命名空间,但是在我正在处理的项目中这是不可能的。

2 个答案:

答案 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>并删除那里的命名空间声明。