如何在Spring Integration Java DSL中创建MessageSelector过滤器?

And*_*sun 3 java dsl lambda spring spring-integration

我试图通过lambda表达式创建消息过滤器,以基于标头值评估过滤消息

IntegrationFlows.from(inputChannel())
    .filter((Message<?> m) -> { return m.getHeaders().get(...)...; })
    .transform(...)
    .channel(outputChannel())
    .get();
Run Code Online (Sandbox Code Playgroud)

但有例外

Caused by: java.lang.ClassCastException: com.<...skipped...>.BusinessPayloadData cannot be cast to org.springframework.messaging.Message

只有这个定义对我有用

IntegrationFlows.from(inputChannel())
    .filter(new MessageSelector(){
        @Override
        public boolean accept(Message<?>message){
            return ...;
        }
    })
    .transform(...)
    .channel(outputChannel())
    .get();
Run Code Online (Sandbox Code Playgroud)

是否可以MessageSelector通过lambda表达式创建实例?

Art*_*lan 5

像这样:

.filter(Message.class, m -> m.getHeaders().get(...)...)
Run Code Online (Sandbox Code Playgroud)

还有另一种重载的方法可以推断目标方法调用的对象类型。

参见LambdaMessageProcessor源代码。由于我们无法直接从Lambda推断参数类型,因此需要Java:使用lambda参数获取泛型方法的实际类型,因此我们必须像使用另一个顶级类型参数那样进行操作。

否则,它只能以结束Object,目标方法调用将其视为的类型payload