0

我正在使用Spring集成。我得到一個字符串(有效載荷)象下面這樣: r, n, t等效的彈簧表達式語言

<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等價物?

回答

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

可能會保持捕獲()或可能不會。兩者都有效。

0

規劃環境地政司沒有對那些逃脫,但你可以使用正則表達式做選擇......

<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/>的東西。

+0

selector-expression是否理解\ compile「\ r \ n」? – Suvasis

+0

否;就像我說的那樣,SpEL無法逃避這些角色,但是當他們在正則表達式中時,他們不會被SpEL解析,他們被正則表達式引擎解析。這就是爲什麼這是有效的。 –

+0

我的正則表達式爲「(?s) \\ s * (。*)」。我在selector-expression的代碼中嘗試了下面的代碼。選擇器表達式=「有效載荷.getBufferData()匹配('(?s)<元素> \\ s * <Sub>(。*)')」給出的預期爲:org.springframework.expression.spel.SpelParseException :EL1044E :(pos 61):意外地用完了輸入 – Suvasis