我尝试通过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
实例?
答案 0 :(得分:4)
像这样:
.filter(Message.class, m -> m.getHeaders().get(...)...)
还有一个重载方法来推断目标方法调用的对象类型。
请参阅LambdaMessageProcessor
源代码。由于我们无法直接从Lambda Java: get actual type of generic method with lambda parameter推断出参数类型,因此我们必须使用另一个顶级类型参数。
否则它最终只会像Object
一样,目标方法调用将其视为payload
的类型。