我最近从Mule 2.2.1切换到Mule 3.x
这个问题的主旨是Mule 3没有返回堆栈跟踪但Mule 2没有,我如何复制Mule 2的行为?
更多详情:
一些Web服务包含在try-catch中,我们抛出一个ServiceException
@WebFault(name = "ServiceException")
public class ServiceException extends Exception {
private static final long serialVersionUID = 1L;
private Integer errorNumber;
public ServiceException(Exception e, User user) {
super(makeMessage(e));
LoggingDao.logException(this.getMessage(), e.toString());
this.setStackTrace(e.getStackTrace());
this.errorNumber = LoggingDao.getLogId();
} ... etc
我们捕获异常的目的是将堆栈跟踪返回给Web服务调用者,LoggingDao记录堆栈跟踪但Web服务不返回它。
在路上的某个地方,我们跳转到DefaultComponentLifecycleAdapter.java,它会抛出一个MuleException,它会覆盖堆栈跟踪并返回
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Component that caused exception is: org.mule.component.DefaultJavaComponent component for: SedaService{...}. Message payload is of type: Object[]</faultstring>
</soap:Fault>
我如何在Mule 3.x中返回堆栈跟踪
P.S。 我使用的是Mule 3.0.1,它似乎与我上面提供的链接不兼容。
也来自:http://www.mulesoft.org/documentation/display/MULE3USER/Error+Handling
来自mule 2 mule-config.xml的如果流交换模式是请求 - 响应,则在执行后将向调用方返回不同的消息。该消息将org.mule.transport.NullPayload作为其有效负载,并将exceptionPayload属性设置为以下内容:org.mule.api.ExceptionPayload。&lt; 前面提到的是什么给我带来了麻烦?
与交换模式不是“请求 - 响应”有所不同
答案 0 :(得分:2)
我被告知这是Mule 3.x中的已知问题&lt; 3.2 解决方案是编写一个OutFault拦截器 代码由 Tomas Blohm
public class CustomSoapFaultOutInterceptor extends AbstractSoapInterceptor {
private static final Log logger = LogFactory.getLog(CustomSoapFaultOutInterceptor.class);
public CustomSoapFaultOutInterceptor() {
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);
//delete the Mule Exception to have the one throw by the component in the SoapMessage
Throwable t = getOriginalCause(fault.getCause());
fault.setMessage(t.getMessage());
}
private Throwable getOriginalCause(Throwable t) {
if (t.getCause() == null || t.getCause().equals(t))
return t;
else
return getOriginalCause(t.getCause());
}
}
//And then this into mule-config.
<cxf:jaxws-service>
<cxf:outFaultInterceptors>
<spring:bean class="is.tr.mule.interceptor.CustomSoapFaultOutInterceptor"/>
</cxf:outFaultInterceptors>
</cxf:jaxws-service>