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'