2016-09-16 54 views
1

有沒有辦法在Spring header-enricherexpression字段的三元表達式中使用彈簧屬性?看起來像這樣的東西:Spring集成有條件的SpEL使用屬性

<int:header-enricher> 
    <int:header name="DESTINATION" expression="headers['DATA'].routingKey == 'ROUTE1' ? ${route1.db} : ${route2.db}"/> 
</int:header-enricher> 

這導致錯誤說Unexpected token. Expected 'colon(:)' but was 'lcurly({)'。也許我錯過了什麼。

回答

3

嘗試

<int:header-enricher> 
    <int:header name="DESTINATION" expression="headers['DATA'].routingKey == 'ROUTE1' ? '${route1.db}' : '${route2.db}'"/> 
</int:header-enricher> 

<int:header-enricher> 
    <int:header name="DESTINATION" expression="#{headers['DATA'].routingKey == 'ROUTE1' ? '${route1.db}' : '${route2.db}'}"/> 
</int:header-enricher> 
+0

謝謝@哈森!第一個建議幫助我意識到屬性'route1.db'不存在。雖然這只是修復的一部分,但我會接受這個答案。 –

1

Unexpected token. Expected 'colon(:)' but was 'lcurly({)'原因是,有存在於屬性文件沒有屬性route1.db,因此表達評價爲headers['DATA'].routingKey == 'ROUTE1' ? ${route1.db} : some-alternative-db,留下${route1.db}不變。這導致語法錯誤。

此外,@哈森建議把單引號,這是需要呈現屬性文件中的值作爲適當的字符串。如果沒有它,評估表達式headers['DATA'].routingKey == 'ROUTE1' ? direct-db : some-alternative-db將把direct-dbsome-alternative-db視爲Spring字段/屬性,它們甚至是以錯誤命名的變量開頭。

最後,有效形式應該是:

<int:header name="DESTINATION" expression="headers['DATA'].routingKey == 'ROUTE1' ? '${route1.db}' : '${route2.db}'"/> 

並考慮到的屬性文件包含以下內容:

route1.db=direct-db route2.db=some-alternative-db

所評估的表達式將是:

headers['DATA'].routingKey == 'ROUTE1' ? 'direct-db' : 'some-alternative-db'