如何使用 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);
}
我显然使用了错误的语句来引用 redemption
的 orderId
成员:
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
丰富了两个变量 args
和 gatewayMethod
。
如您所见,没有任何参数按其名称填充。这对所有 JVM 都有效吗?
您可以使用 args
中的参数索引实现您的目标:
expression = "#args[0].orderId"
这应该是一个简单的问题,但我在网上找不到合适的文档。我想这样做:
@MessagingGateway(name = "redemptionGateway", defaultRequestChannel = Channels.GATEWAY_OUTPUT, defaultHeaders = @GatewayHeader(name = "orderId", expression = "#redemption.orderId"))
public interface RedemptionGateway {
void create(TrivialRedemption redemption);
}
我显然使用了错误的语句来引用 redemption
的 orderId
成员:
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
丰富了两个变量 args
和 gatewayMethod
。
如您所见,没有任何参数按其名称填充。这对所有 JVM 都有效吗?
您可以使用 args
中的参数索引实现您的目标:
expression = "#args[0].orderId"