Spring表达式语言相当于\ r,\ n,\ t \ t等

时间:2013-03-28 17:48:35

标签: spring router spring-integration spring-el html-escape-characters

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

<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>

理想情况下,第一个路由器应该通过测试,但在这种情况下它会失败。任何人都可以帮我找出什么是\ r \ n等的SpEL等同物?

2 个答案:

答案 0 :(得分: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/>的内容。

答案 1 :(得分: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"/>

可以继续捕获()或不捕获。两者都有效。