
Spring XD Type Conversion
Spring Integration 的 Type ConversionH1
Datatype ChannelH2
Datatype Channel 可以指定Channel接收的数据的数据类型
bash
<int:channel id="numberChannel" datatype="java.lang.Number"/><int:channel id="stringOrNumberChannel" datatype="java.lang.String,java.lang.Number"/>
指定了datatype之后,如果Channel收到了类型不是指定的类型,会如下进行:
- 查找是否定义了一个叫做”integrationConversionService”的Bean,该Bean是Spring’s Conversion Service的实例。如果没有,则会抛出异常。
- 如果存在,则会尝试使用它将Message的Payload类型转换为Channel的
datatype
定义了Converter的方式如下:
- 实现
Converter接口 public static class StringToIntegerConverter implements Converter<String, Integer> { public Integer convert(String source) { return Integer.parseInt(source); } } - Integration Conversion Service中注册为一个Converter
<int:converter ref=“strToInt”/>
当bash
<bean id="strToInt" class="org.springframework.integration.util.Demo.StringToIntegerConverter"/>converter元素被解析时,容器会注册名为”integrationConversionService”的bean,同时将convert注入到该bean中。
从4.0版本开始
integrationConversionService会由DefaultDatatypeChannelMessageConverter在application conext中查找,并调用。可以通过指定channel的message-converter属性,来只用另外的转换机制,指定的值需要实现MessageConverter接口。
同时也可以通过注解的方式注册converter:
bash
@Component@IntegrationConverterpublic class TestConverter implements Converter<Boolean, Number> {public Number convert(Boolean source) {return source ? 1 : 0;}}
Spring XD 的 Type ConversionH1
Spring XD 通过模块参数--outputType=application/json,让Spring XD注册实例的的时候动态设置datatype的方式,实现type conversion,本质上还是利用了Spring Integration的转换机制来实现的。
Spring XD 环境中使用CompositeMessageConverter(message-converter属性)来进行转换。Spring XD将xd.messageConverters和customMessageConverters的两个list注入到CompositeMessageConverter,并代理给它们进行实际的转换工作。
之所以CompositeMessageConverter的机制是比较满意的,是因为在 Spring XD 环境中,一个模块的从上一个模块的接收到Message的Payload类型是不确定的(Converter的Source类型是不确定的)。比如,Spring XD 提供的转换器能够将任何Java对象转换为Tuple。但是针对每个类转换到Tuple的方式是不一样的。所以CompositeMessageConverter需要根据outputType参数以及实际的传入类型来找到合适的转换器进行转换。
在Spring XD中实现自定义的转换器,只需要注册”customMessageConverters”,并添加到converter其中
bash
<!-- Users can override this to add converters.--><util:list id="customMessageConverters"><bean class="..."/></util:list>
向”customMessageConverters”中注册的converter需要继承AbstractFromMessageConverter类。
评论
新的评论
上一篇
用spring social构建API的client端
介绍 Spring Social可以用来连接Software-as-a-Service (SaaS) 服务商提供了REST API,Spring的项目本身已经提供了对Facebook, Twitter, Linkedin, Github等服务商的REST API的连接。 实际在…
下一篇
Android Authenticator
对用Android的Authenticator,官方的API Guides是似乎没有很好的介绍文档,Reference中也只是简单地介绍了一下。虽然 sync-adapters 中对于Authenticator有提及,但是对于其用法也没有一个完整的认识,所以对其进行一定的学习并…
