#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), и сложных случаев следует избегать. Спасибо за вашу помощь 🙂