跳到主要内容

路由器和Spring表达式语言 (SpEL)

QWen Plus 中英对照 Routers and the Spring Expression Language (SpEL)

有时,路由逻辑可能很简单,为它编写一个单独的类并将其配置为 bean 可能显得过于复杂。从 Spring Integration 2.0 开始,我们提供了一种替代方案,允许您使用 SpEL 来实现以前需要自定义 POJO 路由器的简单计算。

备注

有关 Spring 表达式语言的更多信息,请参阅 Spring 框架参考指南的相关章节

通常,SpEL 表达式会被求值,其结果会被映射到一个通道,如下例所示:

<int:router input-channel="inChannel" expression="payload.paymentType">
<int:mapping value="CASH" channel="cashPaymentChannel"/>
<int:mapping value="CREDIT" channel="authorizePaymentChannel"/>
<int:mapping value="DEBIT" channel="authorizePaymentChannel"/>
</int:router>
xml

以下示例展示了用 Java 配置的等效路由器:

@Router(inputChannel = "routingChannel")
@Bean
public ExpressionEvaluatingRouter router() {
ExpressionEvaluatingRouter router = new ExpressionEvaluatingRouter("payload.paymentType");
router.setChannelMapping("CASH", "cashPaymentChannel");
router.setChannelMapping("CREDIT", "authorizePaymentChannel");
router.setChannelMapping("DEBIT", "authorizePaymentChannel");
return router;
}
java

以下示例展示了用 Java DSL 配置的等效路由器:

@Bean
public IntegrationFlow routerFlow() {
return IntegrationFlow.from("routingChannel")
.route("payload.paymentType", r -> r
.channelMapping("CASH", "cashPaymentChannel")
.channelMapping("CREDIT", "authorizePaymentChannel")
.channelMapping("DEBIT", "authorizePaymentChannel"))
.get();
}
java

为了进一步简化,SpEL 表达式可以求值为一个通道名称,如下表达式所示:

<int:router input-channel="inChannel" expression="payload + 'Channel'"/>
xml

在前面的配置中,结果通道是通过 SpEL 表达式计算的,该表达式将 payload 的值与字面量 String 'Channel' 进行连接。

SpEL 用于配置路由器的另一个优点是表达式可以返回一个 Collection,这使得每个 <router> 实际上成为一个接收者列表路由器。每当表达式返回多个通道值时,消息就会被转发到每个通道。以下示例展示了这样一个表达式:

<int:router input-channel="inChannel" expression="headers.channels"/>
xml

在上述配置中,如果消息包含一个名为 'channels' 的header,且该header的值是一个渠道名称的 List ,则消息将被发送到列表中的每个渠道。当你需要选择多个渠道时,集合投影和集合选择表达式也可能很有用。有关更多信息,请参见: