使用 XPath 路由 XML 訊息

與基於 SpEL 的路由器類似,Spring Integration 提供了基於 XPath 運算式路由訊息的支援,讓您可以建立具有輸入通道但沒有輸出通道的訊息端點。相反地,一個或多個輸出通道是動態決定的。以下範例示範如何建立這樣的路由器

<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> 包含多個通道名稱。因此,訊息會傳送到列表中的所有通道。

因此,假設傳遞到以下路由器設定的 XML 檔案包含許多代表通道名稱的 responder 子元素,訊息會傳送到所有這些通道

<!-- 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),但您不想將回應者名稱與通道名稱耦合,您可以提供額外的映射設定,如下所示

<!-- 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>,這可以處理單一通道情境以及多個通道情境。

儘管如此,某些 XPath 運算式可能會從一開始就評估為 String 類型。例如,考慮以下 XPath 運算式

name(./node())

此運算式傳回根節點的名稱。如果使用預設評估類型 NODESET,則會導致例外狀況。

對於這些情況,您可以使用 evaluate-as-string 屬性,讓您可以管理評估類型。預設值為 FALSE。但是,如果您將其設定為 TRUE,則會使用 String 評估類型。

XPath 1.0 指定 4 種資料類型

  • 節點集

  • 字串

  • 數字

  • 布林值

當 XPath 路由器使用選用的 evaluate-as-string 屬性評估運算式時,傳回值由 XPath 規範中定義的 string() 函數決定。這表示,如果運算式選取多個節點,它會傳回第一個節點的字串值。

如需更多資訊,請參閱

例如,如果我們想要根據根節點的名稱進行路由,可以使用以下設定

<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 Payload 轉換器

對於 XPath 路由器,您也可以指定在 XPath 評估之前轉換 Payload 時要使用的轉換器。因此,XPath 路由器支援 XmlPayloadConverter 策略的自訂實作,並且在 XML 中設定 xpath-router 元素時,可以透過 converter 屬性提供對此實作的參考。

如果未明確提供此參考,則會使用 DefaultXmlPayloadConverter。在大多數情況下,它應該足夠使用,因為它可以從 Node、Document、Source、File 和 String 類型的 Payload 進行轉換。如果您需要擴展超出該預設實作的功能,那麼在大多數情況下,上游轉換器通常是更好的選擇,而不是在此處提供對此策略的自訂實作的參考。