Верблюжий проект указывает параметр для подготовленного оператора 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".