使用 XPath 路由 XML 消息

与基于 SPEL 的路由器类似, Spring 集成提供了对基于 XPath 表达式的路由消息的支持,这允许你创建具有 input 通道但没有输出通道的消息端点。 相反,一个或多个 output channel 是动态确定的。 以下示例说明如何创建此类路由器: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>
有关 Router 之间通用属性的概述,请参阅 Common Router Parameters

在内部,XPath 表达式作为 type 进行评估NODESET并转换为List<String>,表示频道名称。 通常,此类列表包含单个通道名称。 但是,根据 XPath 表达式的结果,如果 XPath 表达式返回多个值,则 XPath 路由器也可以具有收件人列表路由器的特征。 在这种情况下,List<String>包含多个频道名称。 因此,消息将发送到列表中的所有通道。spring-doc.cadn.net.cn

因此,假设传递给以下 router 配置的 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/respondersexpression 会生成两个值 (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>of channel names,用于处理单通道场景以及多通道场景。spring-doc.cadn.net.cn

尽管如此,某些 XPath 表达式的计算结果可能是 typeString从一开始。 例如,请考虑以下 XPath 表达式:spring-doc.cadn.net.cn

name(./node())

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

对于这些场景,您可以使用evaluate-as-string属性,用于管理评估类型。 是的FALSE默认情况下。 但是,如果将其设置为TRUEString使用 evaluation type 。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 评估之前转换负载时要使用的 Converter。 因此,XPath 路由器支持XmlPayloadConverter策略,并在配置xpath-router元素中,可以通过converter属性。spring-doc.cadn.net.cn

如果未明确提供此引用,则DefaultXmlPayloadConverter被使用。 在大多数情况下,它应该足够了,因为它可以从 Node、Document、Source、File 和 String 类型的有效负载进行转换。 如果你需要扩展该默认实现的能力,那么在大多数情况下,上游 Transformer 通常是更好的选择,而不是在此处提供对此策略的自定义实现的引用。spring-doc.cadn.net.cn