与基于 SpEL 的路由器类似,Spring Integration 支持基于 XPath 表达式路由消息,这允许您创建具有输入通道但没有输出通道的消息端点。 相反,一个或多个输出通道是动态确定的。 以下示例演示如何创建此类路由器:Spring中文文档

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

在内部,XPath 表达式被计算为类型,并转换为表示通道名称的 a。 通常,此类列表包含单个通道名称。 但是,根据 XPath 表达式的结果,如果 XPath 表达式返回多个值,则 XPath 路由器也可以具有收件人列表路由器的特征。 在这种情况下,包含多个通道名称。 因此,消息将发送到列表中的所有频道。NODESETList<String>List<String>Spring中文文档

因此,假设传递给以下路由器配置的 XML 文件包含许多表示通道名称的子元素,则消息将发送到所有这些通道:responderSpring中文文档

<!-- 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/respondersresponderAresponderBSpring中文文档

<!-- 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 表达式的默认计算类型是 ,它被转换为通道名称,用于处理单通道方案和多通道方案。NODESETList<String>Spring中文文档

尽管如此,某些 XPath 表达式可能从一开始就计算为类型。 例如,请考虑以下 XPath 表达式:StringSpring中文文档

name(./node())

此表达式返回根节点的名称。 如果使用默认评估类型,则会导致异常。NODESETSpring中文文档

对于这些方案,可以使用该属性,该属性可用于管理评估类型。 这是默认的。 但是,如果将其设置为 ,则使用评估类型。evaluate-as-stringFALSETRUEStringSpring中文文档

XPath 1.0 指定 4 种数据类型:Spring中文文档

当 XPath 路由器使用 optional 属性计算表达式时,返回值由 XPath 规范中定义的函数确定。 这意味着,如果表达式选择多个节点,它将返回第一个节点的字符串值。evaluate-as-stringstring()Spring中文文档

有关详细信息,请参阅:Spring中文文档

例如,如果我们想根据根节点的名称进行路由,则可以使用以下配置:Spring中文文档

<int-xml:xpath-router id="xpathRouterAsString"
        input-channel="xpathStringChannel"
        evaluate-as-string="true">
    <int-xml:xpath-expression expression="name(./node())"/>
</int-xml:xpath-router>
有关路由器之间通用属性的概述,请参阅通用路由器参数

XPath 1.0 指定 4 种数据类型:Spring中文文档

当 XPath 路由器使用 optional 属性计算表达式时,返回值由 XPath 规范中定义的函数确定。 这意味着,如果表达式选择多个节点,它将返回第一个节点的字符串值。evaluate-as-stringstring()Spring中文文档

有关详细信息,请参阅:Spring中文文档

XML 有效负载转换器

对于 XPath 路由器,您还可以指定在 XPath 评估之前转换有效负载时要使用的转换器。 因此,XPath 路由器支持策略的自定义实现,并且在 XML 中配置元素时,可以通过属性提供对此类实现的引用。XmlPayloadConverterxpath-routerconverterSpring中文文档

如果未显式提供此引用,则使用 。 在大多数情况下,它应该足够了,因为它可以从 Node、Document、Source、File 和 String 类型的有效负载进行转换。 如果您需要扩展到该默认实现的功能之外,那么在大多数情况下,上游 Transformer 通常是更好的选择,而不是在此处提供对此策略的自定义实现的引用。DefaultXmlPayloadConverterSpring中文文档