Как получить доступ к значениям из списка карт в теле сообщения Apache camel

#arraylist #apache-camel #maps

Вопрос:

Возможно, это легко, но я почему-то пока не могу его взломать. Тело сообщения для обмена в основном представляет собой список карт, в которых как ключ, так и значение являются строками. В качестве примера,

[{'key'='val1'}, {'key'='val2'},...]

Я использую простое выражение, чтобы установить это как свойство, которое я буду использовать в последующих маршрутах. Вот как я это устанавливаю:

.setProperty("myProperty", simple("${body}"))

Но это устанавливает полное тело. Я просто хочу (как-то) установить только часть значений, чтобы избежать установки всего списка карт. То, что я пробовал и до сих пор не работает:

 .setProperty("myProperty", simple("${body}['key']"))
.setProperty("myProperty", simple("${body}[*]['key']"))
.setProperty("myProperty", simple("${body}[0]['key']")) // this returns only the first value, I want all
 

Любая идея/предложение, как я могу этого достичь ?

Комментарии:

1. Вы можете просто сделать процессор и в нем, с помощью обычной Java, перенести все из тела в свойства как следует (например, с помощью stream API)

2. Вам разрешено использовать groovy здесь?

3. @Greenev, к сожалению, нет. В настоящее время работает только с Java.

4. @AlexeyYakunin, с процессорами и Java-кодом это легко сделать. Однако я искал что-то, что можно было бы сделать напрямую с помощью ПРОСТЫХ выражений. Я понял, что ПРОСТОЕ тоже не так гибко. В любом случае, спасибо за ваш совет 🙂

Ответ №1:

Вы можете получить доступ ко всем уровням своего тела с помощью простых выражений:

 ${body} // get whole list of maps
${body[0]} // get first map in the list (index 0)
${body[0][key]} // get value of key "key" from the first map in the list 
 

Чего вы не можете сделать в простом выражении, так это преобразовать вашу структуру данных в другую.

Однако вы можете просто подключить компонент Java к своему маршруту

 from("direct:start")
    ...
    .bean(MyConversionBean.class)
    ...;
 

И выполняйте преобразование с помощью Java

 public class MyConversionBean {
    public List<String> convertBody() {
        // extract all values (or whatever) with Java;
        return listOfValues;
    }
}
 

Комментарии:

1. Да, вы правы! Я узнал это сейчас, что ПРОСТЫЕ выражения предназначены для простых случаев использования (:D), и сложных случаев следует избегать. Спасибо за вашу помощь 🙂