Spring integration lambda和匿名转换器的不同行为

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

当使用lambda表达式定义接受消息类型源的转换器时,将引发ClassCastException。但是,如果使用匿名内部类定义语义相同的转换器,则不会发生错误

@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))