我正在使用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('<Element><Sub-Element>')"/>
<int:recipient channel="channel2" selector-expression="!payload.startsWith('<Element><Sub-Element>')"/>
</int:recipient-list-router>
理想情况下,第一个路由器应该通过测试,但在这种情况下它会失败。任何人都可以帮我找出什么是\ r \ n等的SpEL等同物?
答案 0 :(得分:0)
Spel没有转义,但您可以使用正则表达式进行选择......
<recipient selector-expression="payload matches '<Element>\r\n<Sub-Element>.*'" channel="channel1"/>
<recipient selector-expression="!(payload matches '<Element>\r\n<Sub-Element>.*')" channel="channel2"/>
如果你不熟悉正则表达式,那么最后的.*
会匹配任何东西(因此这个正则表达式相当于startsWith())。
编辑:
虽然这会起作用,但我觉得我应该指出,依赖于XML文档中微不足道的空白区域中的特定值是脆弱的 - 如果客户端改为使用,比如说\n
,甚至没有空格,申请会破产。您应该考虑使用类似<int-xml:xpath-router/>
的内容。
答案 1 :(得分:0)
谢谢加里。 所以工作列表 - 收件人 - 路由器看起来像
要么
<recipient selector-expression="payload matches '(?s)<Element>(\s*)<Sub>(.*)'" channel="channel1"/>
<recipient selector-expression="!(payload matches '(?s)<Element>(\s*)<Sub>(.*)')" channel="channel2"/>
或者
<recipient selector-expression="payload matches '(?s)<Element>(.*)<Sub>(.*)'" channel="channel1"/>
<recipient selector-expression="!(payload matches '(?s)<Element>(.*)<Sub>(.*)')" channel="channel2"/>
可以继续捕获()
或不捕获。两者都有效。