2

最近、Mule 2.2.1 から Mule 3.x に切り替えました

これの要点は、Mule 3 はスタックトレースを返さないが、Mule 2 は返すということです。Mule 2 の動作を再現するにはどうすればよいですか?

詳細:

一部の Web サービスは、ServiceException をスローする try-catch にラップされています。

@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

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 でスタックトレースを返すにはどうすればよいですか?

PS私はMule 3.0.1を使用していますが、これは上記のリンクと互換性がないようです。

からも: http://www.mulesoft.org/documentation/display/MULE3USER/Error+Handling

フロー exchange-pattern が request-response の場合、実行後に別のメッセージが呼び出し元に返されます。メッセージにはペイロードとして org.mule.transport.NullPayload があり、exceptionPayload 属性は次のように設定されています。

mule 2 から mule-config.xml は、exchange-pattern が「request-response」ではないという点で異なります。

4

1 に答える 1

2

これはMule3.x<3.2の既知の問題であると言われています。解決策は、TomasBlohmによるOutFaultInterceptorコードを作成することです

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>
于 2012-04-18T09:48:52.097 に答える