使用Mule ESB在mysql DB中插入json对象

时间:2015-02-11 00:32:42

标签: mysql json string mule

晚上好!

我正在尝试将整个json对象插入到mysql表中。我正在使用json对象转换器将json转换为HashMap。杰森是这样的:

    {
   "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]访问它时,抛出异常:

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之前,我得到了内容"将对象转换为变量#[json:content]并将其记录在DB #[flowVars.rawContent]中。当我从DB中检索它时,我使用Object to String转换器将ResultSet转换为String。

但是,我对此解决方案并不满意。这是正确的方法吗?还是存在其他的?也许是正确的。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

当你收到json时,你可以转换为Map类(默认情况下json:json-to-object-transformer返回JsonData)。出于这个原因,我已经指定了Map类。因此,之后您可以使用#[payload.content]

从有效负载中读取内容

我附上了我的流程:

<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>

答案 1 :(得分:1)

Eddú是对的,但他给出的例子实在太复杂了。

正如他所说,你所需要的只是:

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

在该变换器之后,您可以检索Map中的任何字段/子字段。我建议顺便使用message.payload代替payload,后者在过去表现出一些奇怪的行为。

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

此外,这将为您提供类型为java.util.Map的对象。不确定你将如何在数据库中插入对象,但由于你没有在你的问题中显示这一部分,我想你会想出来......