2015-02-11 48 views
1

晚上好!插入JSON對象在MySQL DB中與騾子ESB

我想將整個json對象插入到mysql表中。我使用json來對象轉換器將json轉換成HashMap。 JSON是這樣的:

{ 
    "content": { 
     "fill": "none", 
     "stroke": "#fff", 
     "path": [ 
     ["M", 422, 115], 
     ["L", 472, 167.5] 
     ], 
     "stroke-width": 4, 
     "stroke-linecap": "round", 
     "stroke-linejoin": "round", 
     "transform": [], 
     "type": "path", 
     "note": { 
     "id": 47, 
     "page":0, 
     "ref": 3, 
     "txt": "teste do serviço", 
     "addedAt": 1418133743604, 
     "addedBy": "valter.gomes" 
     } 
    } 
} 

我需要插入「內容」的對象,但是當我試圖訪問它通過#[payload.content],threws一個例外:

Root Exception stack trace: 
java.sql.SQLException: Incorrect string value: '\xAC\xED\x00\x05sr...' for column 'content' at row 1 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823) 
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything) 

我們發現什麼,我認爲是一個解決辦法。在轉換成HashMap之前,我將「content」對象放入一個變量#[json:content]中,並將其記錄在DB #[flowVars.rawContent]中。當我從數據庫中檢索它時,我使用Object to String轉換器將ResultSet轉換爲String。

但是,我不適合這個解決方案。這是否正確嗎?或者確實存在其他的?也許是正確的。

Tks很多爲您的幫助。

回答

1

當你收到json的時候你可以轉換成Map類(默認json:json-to-object-transformer返回JsonData)。出於這個原因,我指定了Map類。

<flow name="demoFlow1" doc:name="demoFlow1">  
    <http:inbound-endpoint exchange-pattern="request-response" 
      host="localhost" port="8081" path="demo" doc:name="HTTP" /> 
    <scripting:component doc:name="Groovy"> 
     <scripting:script engine="Groovy"><![CDATA[ 
      Map<String, Object> map1 = new HashMap<String, Object>(); 
      map1.put("fill","none"); 
      map1.put("stroke","#fff"); 
      Map<String, Object> map = new HashMap<String, Object>(); 
      map.put("content", map1); 
      return map;]]></scripting:script> 
    </scripting:component> 
    <json:object-to-json-transformer doc:name="Object to JSON"/> 
    <logger level="INFO" message=">>1 #[payload]" doc:name="Logger" /> 
    <json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/>  
    <set-payload value="#[payload.content]" doc:name="Set Payload"/> 
    <json:object-to-json-transformer doc:name="Object to JSON"/> 
    <logger level="INFO" message=">>3 #[payload]" doc:name="Logger" /> 
</flow> 
+0

TksEddúfor replay ..我試了一下並很好地工作..我正在接收該異常,因爲在mysql中的字段類型。爲了解決這個問題,我將數據庫改爲了postgresql,它支持json類型。 – 2015-02-13 00:11:10

+0

不投票,因爲缺乏我的名譽 – 2015-02-13 00:26:25

+1

這不是關於聲譽,這是關於是有用的,並幫助你解決你的答案http://stackoverflow.com/help/accepted-answer – 2015-02-13 03:49:17

1

Eddú是正確的,但他給出的例子實在是太複雜了:那麼,在這之後您可以使用#[payload.content]

我重視我的流程讀取有效載荷的內容。

正如他所說的,你需要的是:

<json:json-to-object-transformer returnClass="java.util.Map" /> 

該變壓器後,您可以在地圖檢索任何字段/子字段。順便提一下,我建議使用message.payload而不是​​,後者在過去已經顯示出一些奇怪的行爲。

所以使用:#[message.payload.content]

而且,這會給你java.util.Map類型的對象。不知道你如何將對象插入到數據庫中,但因爲你沒有在你的問題中顯示這個部分,我想你會發現它...

+0

Tks很多你的幫助大衛Dossot .. 。我使用地圖和工作..因爲我已經評論,插入數據庫我使用postgresql,它有本地支持。 Tks還提供了重構代碼的技巧。 – 2015-02-13 00:22:38

+0

未投票,因爲缺乏對我的聲譽 – 2015-02-13 00:25:19