跳到主要内容
版本:7.0.2

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

DeepSeek V3 中英对照 Routers and the Spring Expression Language (SpEL)

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

备注

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

通常,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>

以下示例展示了在 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 DSL 中配置的等效路由器:

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

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

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

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

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

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

在上述配置中,如果消息包含名为"channels"的头部,且该头部的值是频道名称的List,则消息将被发送到列表中的每个频道。当需要选择多个频道时,您可能还会发现集合投影和集合选择表达式很有用。更多信息请参阅: