Верблюжий проект указывает параметр для подготовленного оператора SQL

У меня есть опрос обогатить, который обогащает POJO с результатом запроса SQL (из базы данных MySQL). В настоящее время он получает марку от POJO, а затем получает название из заказа, соответствующего бренду. Я должен был добавить кавычки вокруг ${body.getBrand}, иначе запрос будет искать столбец с названием бренда вместо использования значения. В настоящее время это выглядит так:

<pollEnrich id="_enrich1" strategyRef="merge" timeout="5000">
    <simple>sql:SELECT name FROM orders WHERE brand= '${body.getBrand}'</simple>
</pollEnrich>

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

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

Я пробовал много разных вещей, таких как, например, установка заголовка и изменение запроса, чтобы иметь именованный параметр:

<setHeader headerName="brand" id="brand">
    <simple>${body.getBrand}</simple>
</setHeader>
<pollEnrich id="_enrich1" strategyRef="merge" timeout="5000">
    <simple>sql:SELECT name FROM orders WHERE brand= :#brand</simple>
</pollEnrich>

но я продолжаю получать

PreparedStatementCallback; неверная грамматика SQL [ВЫБРАТЬ имя из заказов ГДЕ brand=?]; вложенным исключением является java.sql.SQLException: для параметра 1 не указано значение

Я также попытался установить для параметра useMessageBodyForSql значение true (поскольку это казалось чем-то, что могло бы помочь?), Но все, что я пробовал, казалось, не сработало.

Я видел много примеров / решений для людей, устанавливающих маршруты с помощью Java, но я предполагаю, что должно быть решение для blueprint xml?

Если бы кто-нибудь получил какое-либо предложение или пример, это было бы здорово.

1 ответ

В версии Camel < 2.16, pollEnrich не имеет доступа к исходному обмену и, следовательно, не может прочитать ваш заголовок, следовательно, исключение. Это задокументировано здесь: http://camel.apache.org/content-enricher.html Исходя из вашего примера, нормальное обогащение тоже должно работать, и у него есть доступ к исходному обмену. Попробуйте изменить "pollEnrich" на "enrich".

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