MULE 自定義Transformer&拋出自定義異常提示信息簡單使用例子

工具 版本
mule-standalone 3.9.0
Anypoint-Studio 6.4.0

寫在前面
在一個Flow中,往往單靠mule提供的標準transformer元素是不足以達到某些轉換payload的要求,當然這時候一般是選擇使用編寫自定義transformer來完成某些業務需要的數據轉換。

java transformer圖標

java transformer配置

自定義的java transformer一般繼承AbstractMessageTransformerAbstractTransformer,按照官方文檔說明,後者只獲取payload的內容,前者除了payload外可以獲取頭信息和附件內容。

AbstractTransformer allows you to access and transform the source payload and to specify the encoding to use
If you need to transform the message header and attachments, you can use AbstractMessageTransformer instead to change them directly on the message passed in.

例子裏面繼承AbstractMessageTransformer,繼承後,可以看到生成的java類TestTransformer.java裏面實現抽象方法transformerMessage

抽象方法transformerMessage代碼

    @Override
    public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {
        // TODO Auto-generated method stub
        return null;
    }

對payload的轉換處理均在這個方法裏面進行,通過該方法的參數可以獲取MuleMessage以及輸出編碼信息。拿到MuleMessage可以做的東西太多,相信鍵入.get後AnypointStudio會提示你的^_^ , 返回值是一個Object,這個Object就是payload,因此通過自定義java transformer不僅僅可以轉換處理payload,還能替換掉原始payload換上你所需的內容。
自定義java transformer有時在轉換過程中失敗了,這時候拋出異常提示相信是一般都需要做的,而觀察可以看到抽象方法transformMessage本身拋出異常TransformerException,假如現在轉換一個日期失敗,該如何拋出這個異常並給出合理的異常信息?
查閱異常TransformerException文檔:TransformerException click here 可以知道,它的實例化一般需要org.mule.config.i18n.MessageMessage文檔:Message Click here
那是不是可以編寫類似下面的代碼:

        Message mes = new Message(構造參數);
        TransformerException transformerException = new TransformerException(mes);

但實際編寫會發現不行,因爲Message不能通過構造函數實例化,它的構造函數是protected類型。

不能直接實例化org.mule.config.i18n.Message

總不能拋出一個TranformerException異常都這麼困難吧,畢竟在java中拋出一個異常寫一個int i = 1 / 0;就可以了,最後找到了獲取org.mule.config.i18n.Message的方法。
那即是使用org.mule.config.i18n.MessageFactory,文檔:MessageFactory click here,這個MessageFactory提供createStaticMessage()方法,該方法接受一個String字符串,這樣就可以通過它來創建帶自定義異常信息的Message了。

TestTransformer.java代碼

package testproject;

import org.mule.api.MuleMessage;
import org.mule.api.transformer.TransformerException;
import org.mule.config.i18n.Message;
import org.mule.config.i18n.MessageFactory;
import org.mule.transformer.AbstractMessageTransformer;

public class TestTransformer extends AbstractMessageTransformer {

    @Override
    public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {
        try {
            //模擬轉換失敗拋出異常
            int i = 1 / 0;
        } catch(Exception e) {
            Message mes = MessageFactory.createStaticMessage("轉換日期失敗!");
            TransformerException transformerException = new TransformerException(mes);
            throw transformerException;
        }
        return null;
    }

}

運行結果

參考資料
創建自定義Transformer官方文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章