2017-06-05 99 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