我有一个丰富的投票,它使用 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 也必须有解决方案?
如果有人有任何建议或示例,那就太好了。