Transformer不接受Message作为输入

时间:2017-04-14 13:23:40

标签: java spring spring-integration

我刚刚开始将我们用于项目的Java DSL从Java 7迁移到8,我面临着奇怪的问题。我有ExpressionEvaluatingRequestHandlerAdvice的成功频道,期待AdviceMessage。在Java 7版本中,它可以正常使用:

.transform(new GenericTransformer<AdviceMessage, Message<?>>() {
    @Override
    public Message<?> transform(AdviceMessage source) {
        return source.getInputMessage();
    }
})

但当我将其转换为Java 8时:

.<AdviceMessage, Message<?>>transform(advice -> advice.getInputMessage())

它给了我一个例外:

  

org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice $   MessageHandlingExpressionEvaluatingAdviceException:   处理程序失败;嵌套异常是   org.springframework.integration.transformer.MessageTransformationException:   无法转换消息;   嵌套异常是org.springframework.messaging.MessageHandlingException:嵌套   异常是java.lang.ClassCastException:java.lang.Boolean不能   强制转换为org.springframework.integration.message.AdviceMessage

布尔值是我给出的成功表达式的结果,结果证明该方法期望有效载荷并且不让我掌握整个消息。

当我尝试更改流程的其他部分时,无论我在哪里尝试使用期望Message<?>而不是消息的有效负载的泛型参数,错误始终会突然出现。

我无法弄清楚我是否正在执行任何Java 8语法错误,或者错误是完全由于其他原因,因为Java 7版本运行正常。

我在Web上找不到任何Java DSL示例,其中存在对Message的通用转换而不是有效负载,所以我甚至不知道它是否应该工作。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

遗传学擦除的问题。由于那个只变成Object,我们没有选择,除非尝试从邮件中仅提取payload,因为这是最常见的用例。

要解决您的疑虑,您必须使用带有.transform()的重载AdviceMesaage.class版本作为第一个参数。

这样我们就知道了期望的类型,并且可以通过适当的参数调用来调用方法。