工具 | 版本 |
---|---|
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官方文档