工具 | 版本 |
---|---|
mule-standalone | 3.9.0 |
Anypoint-Studio | 6.4.0 |
寫在前面
在一個Flow
中,往往單靠mule提供的標準transformer
元素是不足以達到某些轉換payload
的要求,當然這時候一般是選擇使用編寫自定義transformer來完成某些業務需要的數據轉換。
java transformer圖標
java transformer配置
自定義的java transformer
一般繼承AbstractMessageTransformer
或AbstractTransformer
,按照官方文檔說明,後者只獲取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.Message
,Message
文檔: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官方文檔