Как правильно выбрать запись для обработки в моем маршруте? - PullRequest
0 голосов
/ 05 ноября 2019

Это мой первый вопрос здесь, поэтому, если в моем вопросе отсутствует какая-либо основная информация, пожалуйста, потерпите меня. Я постараюсь добавить необходимую информацию как можно быстрее. Я устанавливаю верблюжий маршрут, который получает URL-адрес из моей базы данных и отправляет этот URL сканеру, который собирает некоторые данные о продукте. Данные, полученные от сканера, затем сохраняются обратно в базу данных в другую коллекцию. Когда я сканирую другой URL, который содержит тот же продукт, я хочу добавить вновь полученные данные к объекту в моей базе данных.

Я попытался сохранить вновь полученные данные в свойстве, а затем установить две константы внайти соответствующий пункт в базе данных. После того, как объект найден, я хочу отправить полученные данные на свой процессор, где я добавляю новые данные в извлеченный объект и затем сохраняю их обратно в БД.

from("direct:myRoute")
...
    .setProperty("newItem").simple("${body}")
    .setBody().constant("{ 'name': $.name}")
    .setBody().constant("{ 'brand': $.brand}")
    .to("mongodb:mongoBean?database={{db}}&collection= 
         {{col}}&operation=findOneByQuery")
...

Ожидаемый результат должен быть, что в моем объекте базы данных хранится старая информация и вновь полученная информация, но я получаю следующее: { 'name': $.name} недействительно BasicDBObject, то же самое для бренда.

Обновление

Итак, я обнаружил, что установка двух констант невозможна для того, чего я хотел достичь. Я немного поэкспериментировал и смог заставить его работать с жестко закодированными примерами.

from("direct:myRoute")
...
    .setProperty("newItem").simple("${body}")
    .setBody().constant("{ 'name': 'product', 'brand': 'manufacturer'}")
    .to("mongodb:mongoBean?database={{db}}&collection= 
         {{col}}&operation=findOneByQuery")
...

Но проблема остается в том, что я хочу установить «имя» и «бренд» как переменные json, извлеченные из тела.

Обновление 2

Я немного изменил код и попробовал следующий пример в моем коде.

from("direct:myRoute")
...
    .setProperty("newItem").simple("${body}")
    .setBody().constant("{ 'name' : '{$.name}', 'brand' : '{$.brand}' }")
    .to("mongodb:mongoBean?database={{db}}&collection= 
         {{col}}&operation=findOneByQuery")
...

Я неполучить ошибку от этого, но она не работает, как ожидалось. Я надеялся, что $ .name и $ .brand будут заменены переменными, хранящимися в теле, но, похоже, они привыкнут «как есть»

2019-11-06 13: 27: 43.363 INFO 2132 --- [XNIO-1 task-1] ОТЛАДКА: Exchange [ExchangePattern: InOut, BodyType: String, Body: {'name': '{$ .name}', 'brand': '{$ .brand} '}]

1 Ответ

0 голосов
/ 06 ноября 2019

Хорошо, мы нашли решение этой проблемы, которое подходит для нашего варианта использования. Мы установили имя и марку в качестве свойств и использовали простое для установки тела с этими свойствами.

from("direct:myRoute")
...
    .setProperty("newItem").simple("${body}")
    .setProperty("name").jsonpath("$.name")
    .setProperty("brand").jsonpath("$.brand")
    .setBody().simple("{'name':'${property.name}','brand':'${property.brand}'}")
    .convertBodyTo(String.class)
    .to("mongodb:mongoBean?database={{db}}&collection= 
         {{col}}&operation=findOneByQuery")
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...