Spring Integration Conditional SpEL с использованием свойств

Есть ли способ использовать свойства пружины в троичном выражении в поле expression Spring header-enricher? Что-то похожее на это:

<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({)'. Может быть, я что-то пропустил.


person Julius Delfino    schedule 16.09.2016    source источник


Ответы (2)


пытаться

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

or

<int:header-enricher>
    <int:header name="DESTINATION" expression="#{headers['DATA'].routingKey == 'ROUTE1' ? '${route1.db}' : '${route2.db}'}"/>
</int:header-enricher>
person Hassen Bennour    schedule 16.09.2016
comment
Спасибо @Хассен! Первое предложение помогло мне понять, что свойство route1.db не существует. Хотя это всего лишь часть исправления, я приму это как ответ. - person Julius Delfino; 16.09.2016

Причина Unexpected token. Expected 'colon(:)' but was 'lcurly({)' заключалась в том, что в файле свойств не существовало свойства route1.db, поэтому выражение оценивалось как headers['DATA'].routingKey == 'ROUTE1' ? ${route1.db} : some-alternative-db, оставляя ${route1.db} без изменений. Это приводит к синтаксической ошибке.

Кроме того, @Hassen предложил поставить одинарные кавычки, необходимые для отображения значений из файлов свойств в виде правильных строк. Без него оцениваемое выражение headers['DATA'].routingKey == 'ROUTE1' ? direct-db : some-alternative-db будет рассматривать как direct-db, так и some-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'

person Julius Delfino    schedule 16.09.2016