mule in action翻译23: 4.2配置转换器
在我们讨论如何使用转换器之前,我们应当先讨论它的作用域和它的常见配置属性。像在第三章中讨论的
endpoints一样,转换器也可以配置为本地的和全局的。例如在下面的 列表4.1中,这个流中有一个VM inbound endpoint--这是一个本地endpoint,这个流对输入进行了base64编码。
Listing4.1 Encoding a payload in Base64
<flowname="base64-flow"> <vm:inbound-endpointpath="base64.in" exchange-pattern="requestresponse"/> <base64-encoder-transformer/> </flow>
这个转换器被认为是本地的,因为它没有"name"属性,并且不能被引用。这样的配置比较简短。但要是你的配置不是短短的一两屏的长度,或者当你有个转换器需要在别的流中共享时,你再使用如上面的简短配置你将难以弄清你使用的不同的转换器,而且你可能失去在不同地方重用一些转换器的机会。当你的配置文件开始增长时,最好是配置全局转换器,而在你endpoint引用他们。如果是为了使配置简洁,则经常使用本地转换器的方式。
下面的配置片段展示了一个全局转换器的配置--一个对象转为二进制数组的转换器(我们将在4.2.1中详细讨论)。
<object-to-byte-array-transformername="ObjectToByteArray" />
现在你明白了如何声明基本的转换器,下面学习如何配置它。
当配置转换器时,你应当考虑下面四个常用的配置属性:
1、ignoreBadInput:这个布尔型属性的用途,在图标4.1中提到过。这个属性用来设置,当输入类型不是支
持的类型时,将什么都不做而返回原样的消息。
2、returnClass:这个属性允许你来设置转换器将返回的类型的全限定名。当你不想使用转化器的默认类型
而要严格限制类型时,这是比较有用的(例如,一个转换器的目标类型可能是
java.lang.Object ,而你却要强制它处理java.util.Map类型的object)
3、encoding:表示转换结果将使用指定的编码方式。在处理不是使用Unicode的老系统时,这是比较有用的
这只对 类似string-tobyte-array-transformer 的输出要进行编码的转换器才是有用的。
4、mimeType:有时只设置返回类型和进行编码设置不足以解决问题;这些情况下,设置一个额外的MIME
可能是有用的。例如一个UTF-8的字符串,它可能是text/plain的,也可能是
text/tab-separated,也可能是其他的。
值得强调的是,上面这些并不是一个转换器可配置的全部属性;各种转换器可能还有其他的配置属性。
例如,xslt-transformer有 xsl-file属性,jaxbobject-to-xml-transformer需要jaxbContext-ref属性。我们将分别在 4.4.2 和4.4.3章节讨论这些转换器。
现在你明白了如何配置一个转换器,现在我们把它们串成链来玩一下。有两种方式串成链:你可以把他们
按需要的顺序放在流里,或者你可以使用 transformer-refs元素设置以空格分割的多个转换器引用列表。
在下面的列表中来看两种风格的使用。
Listing4.2 Two styles of references to declare a chain of three transformers
<object-to-byte-array-transformername="objectToByteArray" /> <object-to-string-transformername="objectToString"/> <mulexml:xslt-transformer name="prancingToBM" xsl-file="xsl/prancing-to-gondor-bm.xsl"/> <flowname="transformerRefsFlow"> <!--使用空格分割的 引用列表--> <http:inbound-endpoint host="localhost" port="8080" transformer-efs="objectToByteArray prancingToBM objectToString"/> <loggermessage="Messagereceived!"/> </flow> <flowname="transformerFlow"> <http:inbound-endpoint host="localhost" port="8081"/> <!--使用transformer列表 引用元素--> <transformerref="objectToByteArray"/> <transformerref="prancingToBM"/> <transformerref="objectToString"/> <loggermessage="Messagereceived!"/> </flow>
第二种方式更稳妥一些,因为使用一些高级的xml编辑器可以检查每个独立的转换器引用,而引用列表的方式只有在运行时mule加载配置的时候才进行检查。
你现在获得了足够的关于配置和使用转换器的知识,下节探讨一些重要的转换器。
最佳实践:查看mule API 中的org.mule.api.transformer.Transformer 可以获知所有可用的转换器。