当前位置: 首页 > 知识库问答 >
问题:

在Mule中设置SOAP故障

韶浩博
2023-03-14

目前,这就是我如何捕捉异常并设置有效负载的方法

<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错误中发送一个错误对象。我怎么能那样做?

默认异常策略发送带有错误消息的SOAP错误。最初,我的目的只是添加记录器,让缺省错误消息在SOAP错误中运行。我添加了Catch exception策略,但后来发现它不会发送SOAP错误。然后我使用回滚策略发送SOAP错误。但是,使用Mule Logger记录策略块内部的异常并没有太大的好处,因为它已经被Mule记录了。

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

共有1个答案

锺离烈
2023-03-14

做这件事有很多方法。其中一种方法是在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>
 类似资料:
  • 我们有一个使用Mule standalone 3.5的应用程序(我知道…)需要强制它使用TLS 1.1或1.2作为HTTPS。 我们已经升级到最新的Java 8(8u112)。我们已经修改了mule的tls默认值。包括以下内容: 我们的HTTPS GET请求结果出现异常: 没有合适的协议(协议被禁用或密码套件不合适)(javax.net.ssl.SSLHandshakeException) 有没有

  • 我面临的情况是,我们不能使用模式来验证传入请求(基本上模式是存在的,但它接受请求中的任何字符串,wsdl设计人员有自己的理由这样做,以接受来自不同来源的请求和灵活性)。但是当收到请求时,我会验证请求包装器的子元素是我们所期望的(为此使用XPath)。现在,如果子元素不是预期的,我想抛出和代码,并且可能包含模式验证失败、请求不包含有效元素的错误消息。 我正在使用Mule3.3,并在元素中执行验证,我

  • 我对SOAP相当陌生,我正在尝试理解SOAP错误处理(在Java中)。我已经读过关于这个话题的书,但仍然有一些概念对我来说还不清楚。 更具体地说,如何使用Eclipse WSDL编辑器处理各种响应代码。我已经使用Eclipse WSDL编辑器创建了我的WSDL,但是我愿意使用另一个工具(如SoapUI)来完成这一任务(处理错误)。 我已经附上了一个简单web服务的图像,它应该接受UserID(请求

  • 我正在使用apache CXF(Spring启动)来开发我的肥皂服务器。在这里,我需要在我的肥皂故障拦截器中记录故障消息,就像在任何肥皂客户端中显示的那样(例如:肥皂UI)。我如何在我的故障拦截器中记录相同的输出?现在它只是显示异常详细信息 输入 输出(在肥皂客户端中显示) UserNotfindException是代码中抛出的自定义异常 我的定制拦截器代码

  • 我有一个关于Mule 3.3.1 CE中Web服务的问题。我有一个Web服务,它公开了三个操作和一个实现这些操作类。这些操作可以返回结果(积极)或异常(AuthExeception,ValidateExeception,等等)。多亏了SOAP Mule组件,当我提出一个Java异常时,框架能够将Java异常编组在一个SOAP故障中,但是如果我想既返回一个SOAP故障给客户机,又用Mule中的异常策

  • 在mule中,我将MySQL DB connector包装在一个缓存范围内,并配置了一个定制的缓存策略,即EHCache。 因此,每当对缓存作用域有重复请求时,它都应该返回存储在其缓存中的数据。但不是这样的。因此,我已经完成了这篇关于如何在Mule中使用CXF配置EHCache的文章 根据建议,我将代码分成两部分,并在缓存范围的请求和响应中使用VM和对象到字符串转换器 但是现在,我遇到了一个新问题