如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

使用 XPath 路由 XML 消息

与基于 SpEL 的路由器类似,Spring Integration 支持根据 XPath 表达式路由消息,这使得您可以创建一个带有输入通道但没有输出通道的消息端点。 相反,一个或多个输出通道是动态确定的。 以下示例展示了如何创建这样的路由器:spring-doc.cadn.net.cn

<int-xml:xpath-router id="orderTypeRouter" input-channel="orderChannel">
    <int-xml:xpath-expression expression="/order/type"/>
</int-xml:xpath-router>
有关路由器常见属性的概述,请参阅 通用路由器参数

内部地,XPath 表达式被评估为类型 NODESET 并转换为代表通道名称的 List<String>。 通常,此类列表仅包含一个通道名称。 然而,基于 XPath 表达式的结果,如果 XPath 表达式返回多个值,则 XPath 路由器也可具备接收方列表路由器的特性。 在这种情况下,List<String> 将包含多个通道名称。 因此,消息会被发送到列表中的所有通道。spring-doc.cadn.net.cn

因此,假设传递给以下路由器配置的 XML 文件包含许多代表频道名称的 responder 子元素,则该消息将被发送到所有这些频道:spring-doc.cadn.net.cn

<!-- route the order to all responders-->
<int-xml:xpath-router id="responderRouter" input-channel="orderChannel">
    <int-xml:xpath-expression expression="/request/responders"/>
</int-xml:xpath-router>

如果返回的值不直接代表通道名称,您可以指定额外的映射参数,将这些返回值映射到实际的通道名称。 例如,如果 /request/responders 表达式产生两个值(responderAresponderB),但您不希望将响应者名称与通道名称耦合,您可以提供额外的映射配置,如下所示:spring-doc.cadn.net.cn

<!-- route the order to all responders-->
<int-xml:xpath-router id="responderRouter" input-channel="orderChannel">
    <int-xml:xpath-expression expression="/request/responders"/>
    <int-xml:mapping value="responderA" channel="channelA"/>
    <int-xml:mapping value="responderB" channel="channelB"/>
</int-xml:xpath-router>

正如前面所述,XPath 表达式的默认评估类型为 NODESET,它会被转换为通道名称的 List<String>,该类型同时处理单通道场景和多通道场景。spring-doc.cadn.net.cn

尽管如此,某些 XPath 表达式从一开始就可能求值为类型 String。 例如,考虑以下 XPath 表达式:spring-doc.cadn.net.cn

name(./node())

此表达式返回根节点的名称。 如果正在使用默认评估类型 NODESET,则会产生异常。spring-doc.cadn.net.cn

对于这些场景,您可以使用 evaluate-as-string 属性,它允许您管理评估类型。 默认情况下为 FALSE。 但是,如果您将其设置为 TRUE,则将使用 String 评估类型。spring-doc.cadn.net.cn

XPath 1.0 指定了 4 种数据类型:spring-doc.cadn.net.cn

当 XPath Router 使用可选的 evaluate-as-string 属性评估表达式时,返回值由 string() 函数确定,如 XPath 规范中所定义。 这意味着,如果表达式选择了多个节点,它将返回第一个节点的字符串值。spring-doc.cadn.net.cn

更多信息,请参见:spring-doc.cadn.net.cn

例如,如果我们想根据根节点的名称进行路由,可以使用以下配置:spring-doc.cadn.net.cn

<int-xml:xpath-router id="xpathRouterAsString"
        input-channel="xpathStringChannel"
        evaluate-as-string="true">
    <int-xml:xpath-expression expression="name(./node())"/>
</int-xml:xpath-router>

XML 负载转换器

对于 XPath 路由器,您还可以指定在 XPath 求值之前转换负载时使用的转换器。 因此,XPath 路由器支持 XmlPayloadConverter 策略的自定义实现,并且在 XML 中配置 xpath-router 元素时,可以通过 converter 属性提供对该实现的引用。spring-doc.cadn.net.cn

如果未明确提供此引用,则使用 DefaultXmlPayloadConverter。 在大多数情况下这已经足够,因为它可以转换来自 Node、Document、Source、File 和 String 类型的负载。 如果您需要超越该默认实现的功能,那么在大多数情况下,上游 Transformer 通常是更好的选择,而不是在此处提供一个指向此策略自定义实现的引用。spring-doc.cadn.net.cn