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

时间:2016-04-20 20:58:46

标签: java spring lambda spring-integration dsl

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

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实例?

1 个答案:

答案 0 :(得分:4)

像这样:

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

还有一个重载方法来推断目标方法调用的对象类型。

请参阅LambdaMessageProcessor源代码。由于我们无法直接从Lambda Java: get actual type of generic method with lambda parameter推断出参数类型,因此我们必须使用另一个顶级类型参数。

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