3

Mule から SOAP 呼び出しを行っています。例外をキャッチするために default-exception-strategy を使用しています。例外が発生した場合、一般的な SOAP 障害メッセージではなく、独自の障害コードと障害文字列を送信するにはどうすればよいですか? ありがとう

以下は、ミュール xml、Java コード、実際の出力、および予想される出力のスニペットです。

ミュール XML

<flow name="addressSearchFlow1" doc:name="addressSearchFlow1">
    <invoke object-ref="InvoiceManager" method="completeSearchObject"
        methodArguments="#[message.payload]"></invoke>

    <logger level="INFO" doc:name="Logger" />

    <processor-chain doc:name="Search Processor Chain">
        <cxf:jaxws-client operation="doSearch"
            clientClass="com.invoice.web_2007_09.ProWeb" port="InvoicePortType"
            wsdlLocation="proweb.wsdl" enableMuleSoapHeaders="true" doc:name="SOAP">
        </cxf:jaxws-client>
        <http:outbound-endpoint exchange-pattern="request-response"
            method="POST" ref="InvoiceEndPoint" doc:name="HTTP" />
    </processor-chain>

    <default-exception-strategy>
        <processor-chain>
            <logger message="Exception_logger" level="INFO" doc:name="Exception_logger" />
            <custom-transformer class="com.managers.CustomExceptionHandler" />
            <logger message="Exception_logger" level="INFO" doc:name="Exception_logger" />
        </processor-chain>
    </default-exception-strategy>

</flow>

Java コード

package com.managers;

import org.mule.api.MuleMessage;
import org.mule.api.transformer.TransformerException;
import org.mule.message.ExceptionMessage;
import org.mule.transformer.AbstractMessageTransformer;

public class CustomExceptionHandler extends AbstractMessageTransformer {

public CustomExceptionHandler() {
    setName("CustomExceptionHandler");
}

@Override
public Object transformMessage(MuleMessage message, String outputEncoding)
        throws TransformerException {

    ExceptionMessage exceptionMessage = (ExceptionMessage)message.getPayload();

    String outputMessage = "<soap:Fault xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">        "
            + " <faultcode>soap:Server</faultcode> "
            + "<faultstring>"
            + "An unexpected error has occured. Please contact your service desk and quote this error \""  + exceptionMessage.getException() +  "\""+ "</faultstring>      " + "</soap:Fault>";
    return outputMessage;

}

}

実際の出力


<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring> dt-invoice. Failed to route event via endpoint: org.mule.module.cxf.CxfOutboundMessageProcessor. Message payload is of type: PostMethod</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

期待される出力


<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring> An unexpected error has occured. Please contact your service desk and quote this error   "org.mule.api.transport.DispatchException: dt-invoice. Failed to route event via endpoint: org.mule.module.cxf.CxfOutboundMessageProcessor. Message payload is of type: PostMethod"
</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>
4

2 に答える 2

1

以下のようにフローを更新して、Catch Exception Strategy の使用を開始します。

<flow name="addressSearchFlow1" doc:name="addressSearchFlow1">
    <invoke object-ref="InvoiceManager" method="completeSearchObject"
        methodArguments="#[message.payload]"></invoke>

    <logger level="INFO" doc:name="Logger" />

    <processor-chain doc:name="Search Processor Chain">
        <cxf:jaxws-client operation="doSearch"
            clientClass="com.invoice.web_2007_09.ProWeb" port="InvoicePortType"
            wsdlLocation="proweb.wsdl" enableMuleSoapHeaders="true" doc:name="SOAP">
        </cxf:jaxws-client>
        <http:outbound-endpoint exchange-pattern="request-response"
            method="POST" ref="InvoiceEndPoint" doc:name="HTTP" />
    </processor-chain>

    <catch-exception-strategy>          
        <logger message="Exception_logger" level="INFO" doc:name="Exception_logger" />
        <custom-transformer class="com.managers.CustomExceptionHandler" />
        <logger message="Exception_logger" level="INFO" doc:name="Exception_logger" />          
    </catch-exception-strategy>
</flow>

また、カスタム トランスフォーマーでは、例外はペイロードとしてメッセージに存在しません。これは、exceptionPayload で利用できます。そのため、結果として ExceptionPayload が得られる message.getExceptionPayload() を使用します。exceptionPayload オブジェクトから、例外メッセージとその他の詳細を取得できます。

お役に立てれば。

于 2013-08-14T12:06:52.257 に答える