我有一个民意调查,它通过SQL查询(来自MySQL数据库)的结果丰富了POJO。它目前从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语法[SELECT name FROM orders WHERE brand =?];嵌套异常是java.sql.SQLException:没有为参数1指定值
我也尝试将useMessageBodyForSql选项设置为true(因为这看起来似乎有些帮助吗?)但我尝试的任何内容似乎都没有用。
我已经看到很多人们使用java设置路由的示例/解决方案,但我认为还必须有蓝图xml的解决方案?
如果有人有任何建议或例子会很棒。
答案 0 :(得分:0)
Camel版本&lt; 2.16,pollEnrich无法访问原始交换,因此无法读取您的标头,因此例外。这在此处记录:http://camel.apache.org/content-enricher.html 从你的例子中猜测,正常的充实也应该起作用,它可以访问原始的交换。尝试将'pollEnrich'改为'rich'。