2

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

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

我显然使用了错误的语句来引用orderId成员redemption

org.springframework.expression.spel.SpelEvaluationException: EL1007E:(pos 0): 在 null 上找不到属性或字段“orderId”
4

1 回答 1

3

好的。看

@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"
于 2016-08-12T14:33:26.607 回答