目前,这就是我如何捕捉异常并设置有效负载的方法
<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提供的示例拦截器类。
做这件事有很多方法。其中一种方法是在Catch块中使用表达式组件,如下所示:-
<catch-exception-strategy doc:name="Catch Exception Strategy">
<set-variable variableName="id" value="Invalid Request !!!" doc:name="Variable"/>
<expression-transformer expression="#[message.payload="<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>\n
<soap:Body>\n <soap:Fault>\n <faultcode>INVALID_REQUEST</faultcode>\n <faultstring>Invalid Request</faultstring>\n <detail>\n <ns4:Fault xmlns='http://services.test.com/schema/report/SendReport' xmlns:ns4='http://services.test.com/schema/common/Fault'>\n <ns4:errCode>-2</ns4:errCode>\n <ns4:errorDesc>System Fault</ns4:errorDesc>\n <ns4:stackTrace>Invalid Request.Please ensure that you use the correct request header as per the schema</ns4:stackTrace>\n </ns4:Fault>\n </detail>\n </soap:Fault>\n </soap:Body>\n </soap:Envelope>"]" 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和对象到字符串转换器 但是现在,我遇到了一个新问题