【问题标题】:How to remove Mule Headers from SOAP response如何从 SOAP 响应中删除 Mule 标头
【发布时间】:2014-10-16 12:04:36
【问题描述】:

我有一个需要公开 SOAP 网络服务的要求。所以我有以下 Mule 流程:-

<jms:activemq-connector name="Active_MQ" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"/>

<flow name="Flow1" doc:name="Flow1" >
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP"/>
<cxf:jaxws-service serviceClass="com.test.services.schema.maindata.v1.MainData"  doc:name="SOAP"/>
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
<jms:outbound-endpoint queue="NewQueue" connector-ref="Active_MQ" doc:name="JMS" exchange-pattern="request-response"/>
<logger message="Response2 :- #[message.payload]" level="INFO" doc:name="Logger"/>
<mulexml:xml-to-object-transformer doc:name="XML to Object"/>
</flow>


<flow name="flow2" doc:name="flow2" >
<jms:inbound-endpoint connector-ref="Active_MQ" address="jms://tcp:NewQueue" doc:name="JMS" exchange-pattern="request-response" disableTemporaryReplyToDestinations="true" responseTimeout="90000"/>
<set-variable variableName="SOAPRequest" value="#[message.payload]" doc:name="Variable"/>
<mulexml:xml-to-object-transformer doc:name="XML to Object"/>
<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl">
<method-entry-point-resolver>
        <include-entry-point method="retrieveDataOperation"/>
        <include-entry-point method="insertDataOperation"/>
        <include-entry-point method="updateDataOperation"/>
        <include-entry-point method="deleteDataOperation"/>
</method-entry-point-resolver>
</component>
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
 </flow>

在这里您可以看到请求从第一个流进入 JMS 队列,第二个流使用 JMS 入站从 JMS 队列中获取它,并且 web 服务实现的类处理它.. 现在服务工作正常,没有任何问题..唯一的问题是它在响应中的 SOAP 中获取 Mule Header,如下所示:-

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Header>
      <mule:header xmlns:mule="http://www.muleumo.org/providers/soap/1.0">
         <mule:MULE_CORRELATION_ID>ID:ANIRBAN-PC-49483-1408719168461-1:1:10:1:1</mule:MULE_CORRELATION_ID>
         <mule:MULE_CORRELATION_GROUP_SIZE>-1</mule:MULE_CORRELATION_GROUP_SIZE>
         <mule:MULE_CORRELATION_SEQUENCE>-1</mule:MULE_CORRELATION_SEQUENCE>
      </mule:header>
   </soap:Header>
   <soap:Body>
      <deleteDataResponse xmlns="http://services.test.com/schema/MainData/V1">
         <Response>Data not exists !!! Please provide correct ID</Response>
         <Id>0</Id>
         <Age>0</Age>
      </deleteDataResponse>
   </soap:Body>
</soap:Envelope>

现在请帮我从 SOAP 响应中删除 Mule 标头。我尝试了以下方法:- &lt;cxf:jaxws-service serviceClass="com.test.services.schema.maindata.v1.MainData" enableMuleSoapHeaders="false" doc:name="SOAP"/&gt; 但没有用 .. 它仍然显示 Mule 标头 .. 请帮助 ..

【问题讨论】:

  • 我正要建议使用enableMuleSoapHeaders="false"(这是正确的方法,请参阅mulesoft.org/jira/browse/MULE-5581),但显然它不适合你。也许是回归?如果您 100% 确定它不起作用,请使用 MuleSoft 打开错误报告。
  • 是的,David .. 我一直尝试.. 我将它设置在 CXF 组件中它不起作用.. 然后我将它设置在 Global CXF 组件中,并从 Mule flow 的 CXF 组件中引用它。 . 但结果相同
  • 那么值得打开一个 JIRA。

标签: soap jms mule mule-studio


【解决方案1】:

在enableMuleSoapHeaders="false" 问题得到解决之前,您可以通过以下任一方式摆脱临时解决方法:

  • 在 HTTP 入站端点和 CXF 服务之间添加一个;为了删除不适当的 SOAP 标头,但 XSL-Transformation
  • 使用 delete-message-property 删除 Flow1 末尾的 MULE_* 属性,就在 mulexml:xml-to-object-transformer 之后

【讨论】:

    【解决方案2】:

    我还找到了将其添加到 cxf:outInterceptors 的替代解决方案

     <cxf:jaxws-service serviceClass="com.test.services.schema.maindata.v1.MainData"  doc:name="SOAP">
       <cxf:outInterceptors >
          <spring:bean id="outfault" class="com.test.services.schema.SOAPOptionalData.SOAPInterceptorOutboundHeaderRemover"/>
      </cxf:outInterceptors> 
    </cxf:jaxws-service>
    

    在 Java 类中:-

    public class SOAPInterceptorOutboundHeaderRemover extends AbstractSoapInterceptor {
    
    public SOAPInterceptorOutboundHeaderRemover() {
    super(Phase.PRE_PROTOCOL);
    }
    
    @Override
    public void handleMessage(SoapMessage arg0) throws Fault {
    List<Header> headerList = arg0.getHeaders();
    Header muleHeader = null;
    boolean isMuleHeader = false;
    for (Header header : headerList) {
    ElementNSImpl element = (ElementNSImpl) header.getObject();
    if ("mule:header".equals(element.getNodeName())) {
    isMuleHeader = true;
    muleHeader = header;
    }
    }
    if (isMuleHeader) {
    arg0.getHeaders().remove(muleHeader);
    }
    
    }
    }
    

    这也很好用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2018-06-11
      • 2012-06-24
      • 2013-06-02
      • 1970-01-01
      • 2011-07-05
      • 2019-11-12
      相关资源
      最近更新 更多