如何使用 SPEL 引用@GatewayHeader 中参数的属性

How to use SPEL to reference attribute of parameter in @GatewayHeader

这应该是一个简单的问题,但我在网上找不到合适的文档。我想这样做:

@MessagingGateway(name = "redemptionGateway", defaultRequestChannel = Channels.GATEWAY_OUTPUT, defaultHeaders = @GatewayHeader(name = "orderId", expression = "#redemption.orderId"))
public interface RedemptionGateway {
    void create(TrivialRedemption redemption);
}

我显然使用了错误的语句来引用 redemptionorderId 成员:

org.springframework.expression.spel.SpelEvaluationException: EL1007E:(pos 0): Property or field 'orderId' cannot be found on null

好的。看

@GatewayHeader(name = "orderId", expression = "#redemption.orderId")

此 SpEL 在运行时根据实际参数进行评估,以构建 MessageHeaders 以便目标 Message 发送。

这就是它的样子:

private StandardEvaluationContext createMethodInvocationEvaluationContext(Object[] arguments) {
    StandardEvaluationContext context = ExpressionUtils.createStandardEvaluationContext(this.beanFactory);
    context.setVariable("args", arguments);

    context.setVariable("gatewayMethod", this.method);
    return context;
}

因此,EvaluationContext 丰富了两个变量 argsgatewayMethod

如您所见,没有任何参数按其名称填充。这对所有 JVM 都有效吗?

您可以使用 args 中的参数索引实现您的目标:

expression = "#args[0].orderId"