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

How to create MessageSelector filter in Spring Integration Java DSL?

我尝试通过 lambda 表达式创建消息过滤器,以根据 header 值评估

过滤消息
IntegrationFlows.from(inputChannel())
    .filter((Message<?> m) -> { return m.getHeaders().get(...)...; })
    .transform(...)
    .channel(outputChannel())
    .get();

但出现异常

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();

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

像这样:

.filter(Message.class, m -> m.getHeaders().get(...)...)

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

查看 LambdaMessageProcessor 源代码。由于我们无法直接从 Lambda 推断参数类型 Java: get actual type of generic method with lambda parameter,我们必须像使用另一个顶级类型参数那样做。

否则它最终只会像 Object 一样,目标方法调用将其视为 payload.

的类型