我刚刚开始将我们用于项目的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的通用转换而不是有效负载,所以我甚至不知道它是否应该工作。
感谢您的帮助。
答案 0 :(得分:0)
遗传学擦除的问题。由于那个只变成Object
,我们没有选择,除非尝试从邮件中仅提取payload
,因为这是最常见的用例。
要解决您的疑虑,您必须使用带有.transform()
的重载AdviceMesaage.class
版本作为第一个参数。
这样我们就知道了期望的类型,并且可以通过适当的参数调用来调用方法。