【问题标题】:Setting SOAP fault in Mule在 Mule 中设置 SOAP 错误
【发布时间】:2023-03-09 18:52:01
【问题描述】:

目前这就是我捕获异常和设置有效负载的方式

<catch-exception-strategy name="Catch_Exception_Strategy">
   <logger message="#[exception.summaryMessage]" level="ERROR" doc:name="Logger"/>
   <set-payload value="Error in service operation" doc:name="Set Payload"/>
</catch-exception-strategy>

但是,CXF SOAP 组件设置了真实响应对象的负载。而我想在 SOAP Fault 中发送错误对象。我该怎么做?

提前致谢。

更新

默认异常策略发送带有错误消息的 SOAP Fault。最初我的目的是添加记录器并让默认错误消息进入 SOAP 故障。我添加了 Catch 异常策略,但后来发现它没有发送 SOAP 错误。相反,我使用了发送 SOAP 错误的回滚策略。然而,使用 Mule Logger 在策略块内记录异常并没有太大的好处,因为它已经被 Mule 记录了。

现在,我意识到使用 cxf:outFaultInterceptor 的优势。您不仅可以向 SOAP Fault 添加自定义元素,还可以将自定义日志隔离在单独的日志文件中。感谢 Anirban 提供示例拦截器类。

【问题讨论】:

    标签: exception soap mule


    【解决方案1】:

    有很多方法可以做到这一点.. 一种方法是在 Catch 块中使用表达式组件,如下所示:-

    <catch-exception-strategy doc:name="Catch Exception Strategy">
      <set-variable variableName="id" value="Invalid Request !!!" doc:name="Variable"/>
      <expression-transformer expression="#[message.payload=&quot;&lt;soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'&gt;\n  
       &lt;soap:Body&gt;\n      &lt;soap:Fault&gt;\n      &lt;faultcode&gt;INVALID_REQUEST&lt;/faultcode&gt;\n      &lt;faultstring&gt;Invalid Request&lt;/faultstring&gt;\n      &lt;detail&gt;\n      &lt;ns4:Fault xmlns='http://services.test.com/schema/report/SendReport' xmlns:ns4='http://services.test.com/schema/common/Fault'&gt;\n      &lt;ns4:errCode&gt;-2&lt;/ns4:errCode&gt;\n      &lt;ns4:errorDesc&gt;System Fault&lt;/ns4:errorDesc&gt;\n      &lt;ns4:stackTrace&gt;Invalid Request.Please  ensure that you use the correct request header as per the schema&lt;/ns4:stackTrace&gt;\n      &lt;/ns4:Fault&gt;\n      &lt;/detail&gt;\n      &lt;/soap:Fault&gt;\n     &lt;/soap:Body&gt;\n    &lt;/soap:Envelope&gt;&quot;]" doc:name="Expression_Custom_Fault_Response"/>
      </catch-exception-strategy>
    

    其他方法是在 CXF 故障拦截器中使用自定义 Java 类:-

    <cxf:jaxws-service service="MainData" serviceClass="Your Service class"  doc:name="SOAPWithHeader" >
    <cxf:outFaultInterceptors>  
    <spring:bean id="outfault" class="Your custom fault interceptor Java Class"/>
    </cxf:outFaultInterceptors>
    </cxf:jaxws-service>
    

    更新答案

    自定义故障拦截器类:-

    public class CustomSoapFault extends AbstractSoapInterceptor
     {
                private static final Log logger = LogFactory.getLog(CustomSoapFaultOutInterceptor.class);
    
            public CustomSoapFault() 
                 {
                    super(Phase.MARSHAL);
                    getAfter().add(Soap11FaultOutInterceptor.class.getName());
                 }
                @Override
                public void handleMessage(SoapMessage message) throws Fault
                 {
                    Fault fault = (Fault) message.getContent(Exception.class);
                    logger.error(fault.getMessage(), fault);
                //custom message in response
         Element detail = fault.getOrCreateDetail();
                    Element errorDetail = detail.getOwnerDocument().createElement("error-reply");
                    Element error = errorDetail.getOwnerDocument().createElement("error");
                    Element extRefNumber = errorDetail.getOwnerDocument().createElement("ExternalReferenceNumber");
                    Element partnerId = errorDetail.getOwnerDocument().createElement("PartnerID");
    
                    partnerId.setTextContent("123");
                    extRefNumber.setTextContent("321");
                    error.setTextContent("Contact the administrator");
    
                    errorDetail.appendChild(error);
                    errorDetail.appendChild(extRefNumber);
                    errorDetail.appendChild(partnerId);
                    detail.appendChild(errorDetail);
                  }
    
      }
    

    //在CXF拦截器中提供类

    <cxf:jaxws-service>
       <cxf:outFaultInterceptors>
          <spring:bean class="com.mypackage.mule.interceptor.CustomSoapFault"/>
       </cxf:outFaultInterceptors>
    </cxf:jaxws-service>
    

    【讨论】:

    • 以上都不适用于 CXF SOAP 组件。还有什么办法吗?
    • 这些是与 CXF Soap webservice 一起使用的最常见方式。如果您遇到问题或无法配置 .. 使用您尝试过的方法更新您的问题 .. 这样会很容易检测您面临的问题...
    • 第一个选项与@​​987654321@ 相同,适用于 cxf 代理服务,但不适用于 jax-ws 情况
    • 在第二个选项中,我将从自定义 java 类返回什么对象?我想我需要为 WSDL 中的错误添加自定义消息类型并从 java 类中返回它...
    • 第一个选项是在异常情况下显示自定义响应的一种方式..您甚至可以在 jax-ws 服务中使用它...。它将在异常情况下执行并显示。 ..第二个选项允许您对故障进行更多控制..您可以使用第二个选项根据异常自定义消息..您可以根据不同的异常类型有不同的消息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多