Spring integration lambda和匿名转换器的不同行为
当使用lambda表达式定义接受消息类型源的转换器时,将引发ClassCastException。但是,如果使用匿名内部类定义语义相同的转换器,则不会发生错误Spring integration lambda和匿名转换器的不同行为,spring-integration,Spring Integration,当使用lambda表达式定义接受消息类型源的转换器时,将引发ClassCastException。但是,如果使用匿名内部类定义语义相同的转换器,则不会发生错误 @Bean public IntegrationFlow lambda(MessageChannel outputChannel) { return f -> f .enrichHeaders(h -> h.header("add", 1)) .<Message&l
@Bean
public IntegrationFlow lambda(MessageChannel outputChannel) {
return f -> f
.enrichHeaders(h -> h.header("add", 1))
.<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))
.channel(outputChannel);
}
@Bean
public IntegrationFlow anonymous(MessageChannel outputChannel) {
return f -> f
.enrichHeaders(h -> h.header("add", 1))
.transform(new GenericTransformer<Message<Integer>, Integer>() {
@Override
public Integer transform(Message<Integer> source) {
return source.getPayload() + source.getHeaders().get("add", Integer.class);
}
})
.channel(outputChannel);
}
我想知道哪一种是理想的行为;转换器应该能够接受消息,还是应该因为预期的有效负载类型而失败?然而,我认为这两种风格的行为应该是相同的
可以找到一个示例项目。请检查org.example.LambdaVsAnonymous和org.example.LambdaVsAnonymousTest。这是Java Lambdas的一个限制
Method.getParameterTypes()
在Lambda上调用时仅返回对象
这里的类型信息
.<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))
…只是一种语法糖,允许您在lambda中引用适当的类型,类似于在lambda中执行显式转换。它不是烤进羔羊肉里的
无法推断lambda需要一条消息
对于匿名内部类,类型信息被保留,因为该方法具有具体的类型。我相信您必须使用转换的类型变量。。。例如.transformMessage.class,m->m.getPayload+m.getHeaders.getadd,Integer.class。
也就是说,我认为我们应该对javadoc进行一些改进,因为它讨论的是负载类型-‘transform from’,而它应该简单地讨论输入转换器应该接受的类型 另请参阅Oleg关于使用重载.transform的答案,该转换采用显式from类型。我切换了接受的答案,因为它为我的问题提供了一个具体的解决方案,但这一答案提供了一些关于实际情况的见解。我希望两样都能接受!明白-没问题。关于此事的公关已经合并
.<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))