java.io.NotSerializableException:org.json.JSONObject

时间:2017-12-19 20:00:23

标签: java mysql rest

JDBCTemplate和MYSQL JSON

我正在编写一个休息服务,我需要在mysql表中添加一些细节。

my mysql table as a area_json,类型为json。

我从休息服务中的post call获得了一个pojo对象,我试图使用jdbctemplate插入它

jdbcTemplate.update("insert into site(area_id,area_json) values(?,?)", area.getareaID(), area.getareaJson());

一旦我使用post man进行发布呼叫,我就会收到以下错误

Invalid argument value: java.io.NotSerializableException;
nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException"

请帮忙

1 个答案:

答案 0 :(得分:3)

首先,请确保使用不早于v5.1.37的Connector / J版本,其中添加了对JSON数据类型的支持,并且最好不要比v5.1.40更旧,这修复了一些与JSON相关的错误。但如果这对你来说是一个问题,那么它最好是次要的。

在此之前,JdbcTemplate需要理解你的JSONObject论点。 The particular method you are using记录了变量参数,包括您的JSONObject

  

绑定到查询的参数(将其留给PreparedStatement   猜对应的SQL类型);也可能包含SqlParameterValue   不仅指示参数值而且指示SQL的对象   类型和可选的比例

当它说出PreparedStatement会猜到时,它只能表示the two-arg version of PreparedStatement.setObject()哪些文件:

  

JDBC规范指定了Java Object的标准映射   类型到SQL类型。给定的参数将转换为   在发送到数据库之前对应的SQL类型。

     

请注意,此方法可用于传递特定于数据库的内容   抽象数据类型,使用特定于驱动程序的Java类型。如果   object是一个实现接口SQLData的类,即JDBC   驱动程序应该调用方法SQLData.writeSQL将其写入SQL   数据流。另一方面,如果对象属于一个类   实现Ref,Blob,Clob,NClob,Struct,java.net.URL,RowId,   SQLXML或Array,驱动程序应将其作为值传递给数据库   对应的SQL类型。

(强调补充。)

JDBC没有对JSON数据类型的内置支持。文档允许Connector / J提供与JSON SQL数据类型对应的驱动程序特定类型,但仅仅因为MySQL和Connector / J支持JSON并不意味着您可以从架子上提取一个随机的JSON表示对象并呈现它对他们而言,他们根本不提供或容纳JSON特定的Java数据类型。由于MySQL似乎不在其Connector/J developer guide中发布或引用任何JDBC扩展API文档,我倾向于怀疑它是否识别出任何类型的这些文档。

那么,您似乎应该依赖于在MySQL的SQL方言中直接编程时所采用的相同技术:

  

在MySQL中,JSON值被写为字符串。 MySQL解析任何字符串   在需要JSON值的上下文中使用,如果出现错误,则会产生错误   它无效为JSON。这些上下文包括插入值   具有JSON数据类型并将参数传递给a的列   需要JSON值的函数[...]。

MySQL 5.7 Reference Manual, section 11.6

也就是说,将您的JSONObject转换为JSON格式String,并以此方式将其呈现给您的模板。在检索时,预计必须反过来。