Skip to content

Commit 3811244

Browse files
authored
GH-6786: Demonstrate #xpath() with a recipient-list-router (#10470)
Fixes: #6786 The original request was about an `xpath-router`, however using the `#xpath()` SpEL function we don't need anything else * Show-case the `#xpath()` with a `<int:recipient-list-router>` * Mention such a feature in the `xpath-routing.adoc`
1 parent ef6722c commit 3811244

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

spring-integration-xml/src/test/java/org/springframework/integration/xml/xpath/XPathTests-context.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,9 @@
3636

3737
<bean id="testNodeMapper" class="org.springframework.integration.xml.xpath.XPathTests$TestNodeMapper"/>
3838

39+
<int:recipient-list-router input-channel="xpathRecipientsInput">
40+
<int:recipient channel="channelA" selector-expression="#xpath(payload, '/passenger/age/text() &lt;= 2', 'boolean')"/>
41+
<int:recipient channel="channelB" selector-expression="#xpath(payload, '/passenger/age/text() > 12', 'boolean')"/>
42+
</int:recipient-list-router>
43+
3944
</beans>

spring-integration-xml/src/test/java/org/springframework/integration/xml/xpath/XPathTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ public class XPathTests {
7777
@Autowired
7878
private MessageChannel xpathRouterInput;
7979

80+
@Autowired
81+
private MessageChannel xpathRecipientsInput;
82+
8083
@Test
8184
@SuppressWarnings("unchecked")
8285
public void testXPathUtils() {
@@ -205,6 +208,22 @@ public void testInt3140Router() {
205208
assertThat(receive.getPayload()).isEqualTo("<name>X</name>");
206209
}
207210

211+
@Test
212+
public void recipientListRouteByXpath() {
213+
this.xpathRecipientsInput.send(new GenericMessage<>("<passenger><age>2</age></passenger>"));
214+
this.xpathRecipientsInput.send(new GenericMessage<>("<passenger><age>16</age></passenger>"));
215+
216+
Message<?> receive = this.channelA.receive(1000);
217+
assertThat(receive)
218+
.extracting(Message::getPayload)
219+
.isEqualTo("<passenger><age>2</age></passenger>");
220+
221+
receive = this.channelB.receive(1000);
222+
assertThat(receive)
223+
.extracting(Message::getPayload)
224+
.isEqualTo("<passenger><age>16</age></passenger>");
225+
}
226+
208227
public static class TestNodeMapper implements NodeMapper<String> {
209228

210229
@Override

src/reference/antora/modules/ROOT/pages/xml/xpath-routing.adoc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,16 @@ For example, if we want to route based on the name of the root node, we can use
8989
evaluate-as-string="true">
9090
<int-xml:xpath-expression expression="name(./node())"/>
9191
</int-xml:xpath-router>
92+
----
93+
94+
The out-of-the-box `#xpath()` xref:spel.adoc#built-in-spel-functions[SpEL function] is also powerful enough to use with a generic router definition, including recipient list router:
9295

96+
[source,xml]
97+
----
98+
<int:recipient-list-router input-channel="xpathRecipientsInput">
99+
<int:recipient channel="channelA" selector-expression="#xpath(payload, '/passenger/age/text() &lt;= 2', 'boolean')"/>
100+
<int:recipient channel="channelB" selector-expression="#xpath(payload, '/passenger/age/text() > 12', 'boolean')"/>
101+
</int:recipient-list-router>
93102
----
94103

95104
[[xpath-routing-converter]]

0 commit comments

Comments
 (0)