GatewayMethodInboundMessageMapper中带有未注释参数的误导性异常消息

时间:2018-12-13 12:13:55

标签: spring-integration

以下代码引发MessagingException和消息At most one parameter (or expression via method-level @Payload) may be mapped to the payload or Message. Found more than one on method [public abstract java.lang.Integer org.example.PayloadAndGatewayHeader$ArithmeticGateway.add(int,int)]

@MessagingGateway
interface ArithmeticGateway {

    @Gateway(requestChannel = "add.input", headers = @GatewayHeader(name = "operand", expression = "#args[1]"))
    Integer add(@Payload final int a, final int b);

}

所需的功能可以通过以下方式实现:

@MessagingGateway
interface ArithmeticGateway {

    @Gateway(requestChannel = "add.input", headers = @GatewayHeader(name = "operand", expression = "#args[1]"))
    @Payload("#args[0]")
    Integer add(final int a, final int b);

}

第一个版本也可以使用吗?不过,我认为错误消息可以得到改善。

可以找到一个示例项目here。请检查org.example.PayloadAndGatewayHeader和org.example.PayloadAndGatewayHeaderTest。

编辑

@GatewayHeader的目的是为了说明为什么人们可能希望拥有不属于有效负载的附加参数,但恐怕会造成混乱。这是一个更简化的示例:

@MessagingGateway
interface ArithmeticGateway {

    @Gateway(requestChannel = "identity.input")
    Integer identity(@Payload final int a, final int unused);

}

应该不会忽略unused参数,因为已经有一个用@Payload注释的参数了吗?

1 个答案:

答案 0 :(得分:1)

您不能将参数注释(静态的)与表达式(动态的)混合使用,因为静态代码分析无法预测动态表达式在运行时将解析的内容。这可能不太可能,但理论上表达式中可能有条件。无论如何,在分析时都无法确定该表达式将在运行时为#args[1]提供一个值(当然,对于这种简单情况,但并非所有情况都如此简单)。

使用一个或另一个;使用第二种方法或

Integer add(@Payload final int a, @Header("operand") final int b);