【问题标题】:How to create MessageSelector filter in Spring Integration Java DSL?如何在 Spring Integration Java DSL 中创建 MessageSelector 过滤器?
【发布时间】:2016-08-13 19:07:35
【问题描述】:

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

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

但有异常

Caused by: java.lang.ClassCastException: com.&lt;...skipped...&gt;.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 实例?

【问题讨论】:

  • 您假设 Lambda 的类型与匿名类相同,但可能不是您想的那样。当我遇到此类问题时,我经常使用的一种技术是使用我的 IDE 的重构工具将 lambda 提取到一个单独的变量中,并查看在变量声明中分配给它的类型。如果它与我的预期不同,我会修改类型,然后使用 IDE 的重构工具将 lambda 内联回原始表达式。我发现它会填充类型转换和其他我不知道要添加的泛型类型分类器。
  • @HankD 当然。我也喜欢你说的。但这里是特定 filter 实现的更复杂的案例原因。

标签: java spring lambda spring-integration dsl


【解决方案1】:

像这样:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多