0

我有一个丰富的投票,它使用 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: No value specified for parameter 1

我也尝试将 useMessageBodyForSql 选项设置为 true (因为这看起来可能会有所帮助?)但我尝试过的任何东西似乎都不起作用。

我已经看到很多使用 java 设置路由的示例/解决方案,但我认为蓝图 xml 也必须有解决方案?

如果有人有任何建议或示例,那就太好了。

4

1 回答 1

0

在 Camel 版本 < 2.16 中,pollEnrich 无法访问原始交换,因此无法读取您的标头,因此出现异常。这在此处记录:http : //camel.apache.org/content-enricher.html 从您的示例中猜测,正常的丰富也应该起作用,并且它可以访问原始交换。尝试将“pollEnrich”更改为“丰富”。

于 2017-06-18T12:36:40.453 回答