10.2.3 转换器
转换器对消息执行一些操作,通常会产生不同的消息,并且可能会产生不同的负载类型(如图 10.4)。转换可以是一些简单的事情,例如对数字执行数学运算或操作 String 字符串值;转换也会很复杂,例如使用表示 ISBN 的 String 字符串值来查找并返回相应书籍的详细信息。
图 10.4 转换器在消息流经集成流时对其进行变形。
例如,假设正在一个名为 numberChannel 的通道上发布整数值,并且希望将这些数字转换为包含等效罗马数字的 String 字符串。在这种情况下,可以声明一个 GenericTransformer 类型的 bean,并添加 @Transformer
注解,如下所示:
@Bean
@Transformer(inputChannel="numberChannel",
outputChannel="romanNumberChannel")
public GenericTransformer<Integer, String> romanNumTransformer() {
return RomanNumbers::toRoman;
}
通过 @Transformer
注解将 bean 指定为 transformer bean,它从名为 numberChannel 的通道接收整数值,并使用 toRoman()
(toRoman()
方法是在一个名为 RomanNumbers 的类中静态定义的,并在这里通过方法引用进行引)的静态方法进行转换,得到的结果被发布到名为 romanNumberChannel 的通道中。
在 Java DSL 配置风格中,调用 transform()
甚至更简单,将方法引用传递给 toRoman()
方法即可:
@@Bean
public IntegrationFlow transformerFlow() {
return IntegrationFlows
...
.transform(RomanNumbers::toRoman)
...
.get();
}
虽然在两个 transformer 代码示例中都使用了方法引用,但是要知道 transformer 也可以使用 lambda 表达式。或者,如果 transformer 比较复杂,需要单独的成为一个 Java 类,可以将它作为 bean 注入流配置,并将引用传递给 transform()
方法:
@Bean
public RomanNumberTransformer romanNumberTransformer() {
return new RomanNumberTransformer();
}
@Bean
public IntegrationFlow transformerFlow(
RomanNumberTransformer romanNumberTransformer) {
return IntegrationFlows
...
.transform(romanNumberTransformer)
...
.get();
}
在这里,声明了一个 RomanNumberTransformer 类型的 bean,它本身是 Spring Integration 的 Transformer 或 GenericTransformer 接口的实现。bean 被注入到 transformerFlow()
方法,并在定义集成流时传递给 transform()
方法。