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

Есть ли способ использовать свойства пружины в троичном выражении на expression поле весны 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({)', Может быть, я что-то пропустил.

2 ответа

Решение

Пытаться

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

Причина 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'

Другие вопросы по тегам