2017-06-05 100 views
0

我有一个民意调查丰富,它丰富了POJO与SQL查询(从MySQL数据库)的结果。它目前从POJO获得品牌,然后从与品牌匹配的订单中获得名称。我必须在$ {body.getBrand}周围添加引号,否则查询将查找具有品牌名称的列而不是使用该值。目前,它看起来像这样:骆驼蓝图指定参数为准备的SQL语句

<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

在骆驼版本< 2.16中,pollEnrich无法访问原始交换,因此无法读取标题,因此是例外。这是在这里记录:http://camel.apache.org/content-enricher.html 从你的例子猜测,一个正常的丰富也应该工作,它有权访问原始交易所。尝试改变'pollEnrich'为'丰富'。

+0

对不起,我应该提到骆驼版本。目前的版本是2.17,因此问题并不在于投票补充无法访问我相信/希望的原始交换。我相信在应用pollEnrich之前sql已经被执行了,并且我没有正确地指定那个参数,但是我不知道如何去做。 – ThunderM

+0

你可以尝试丰富只是为了确保它不是有关pollEnrich奇怪吗?你也可以尝试:#$ {header.brand}在你的查询中? –

+0

没有,因为我已经怀疑它不起作用(我甚至可能已经尝试过或至少类似)。虽然我确实希望这次会有效。 – ThunderM