Camel Blueprint为准备好的sql语句指定参数

时间:2017-06-05 15:23:09

标签: mysql apache-camel camel-sql camel-blueprint

我有一个民意调查,它通过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的解决方案?

如果有人有任何建议或例子会很棒。

1 个答案:

答案 0 :(得分:0)

Camel版本&lt; 2.16,pollEnrich无法访问原始交换,因此无法读取您的标头,因此例外。这在此处记录:http://camel.apache.org/content-enricher.html 从你的例子中猜测,正常的充实也应该起作用,它可以访问原始的交换。尝试将'pollEnrich'改为'rich'。