0

我正在使用 Spring 集成。我得到一个字符串(有效负载),如下所示:

<Element>
<Sub-Element>5</Sub-Element>
</Element>

我需要测试上面的字符串<Element><Sub-Element>是否以实际 开头<Element>\r\n <Sub-Element>.

<int:recipient-list-router id="customRouter" input-channel="routingChannel">
    <int:recipient channel="channel1" selector-expression="payload.startsWith('&lt;Element&gt;&lt;Sub-Element&gt;')"/>
    <int:recipient channel="channel2" selector-expression="!payload.startsWith('&lt;Element&gt;&lt;Sub-Element&gt;')"/>
</int:recipient-list-router>

理想情况下,第一个路由器应该通过测试,但在这种情况下它失败了。谁能帮我找出 SpEL 等价于 \r \n 等?

4

2 回答 2

0

SpEL 没有转义符,但您可以使用正则表达式进行选择...

<recipient selector-expression="payload matches '&lt;Element&gt;\r\n&lt;Sub-Element&gt;.*'" channel="channel1"/>
<recipient selector-expression="!(payload matches '&lt;Element&gt;\r\n&lt;Sub-Element&gt;.*')" channel="channel2"/>

如果你不熟悉正则表达式,.*最后的 可以匹配任何东西(因此这个正则表达式等同于startsWith())。

编辑:

虽然这会起作用,但我觉得我应该指出,依赖 XML 文档中微不足道的空白中的特定值是脆弱的——如果客户端更改为使用,例如\n,或者甚至不使用空白,您的应用程序将会中断。您应该考虑使用类似的东西<int-xml:xpath-router/>

于 2013-03-28T18:43:14.070 回答
0

谢谢加里。所以工作列表收件人路由器看起来像

任何一个

<recipient selector-expression="payload matches '(?s)&lt;Element&gt;(\s*)&lt;Sub&gt;(.*)'" channel="channel1"/>
<recipient selector-expression="!(payload matches '(?s)&lt;Element&gt;(\s*)&lt;Sub&gt;(.*)')" channel="channel2"/>

或者

<recipient selector-expression="payload matches '(?s)&lt;Element&gt;(.*)&lt;Sub&gt;(.*)'" channel="channel1"/>
    <recipient selector-expression="!(payload matches '(?s)&lt;Element&gt;(.*)&lt;Sub&gt;(.*)')" channel="channel2"/>

可以保留捕获(),也可以不保留。两者都有效。

于 2013-04-02T10:21:31.840 回答