java.io.NotSerializableException:org.json.JSONObject

问题描述 投票:0回答:1

JDBCTemplate和MYSQL JSON

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

我的mysql表作为类型json的列area_json

我从休息服务中的post调用得到了一个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"

请帮忙

java mysql rest
1个回答
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对象类型到SQL类型的标准映射。在发送到数据库之前,给定的参数将转换为相应的SQL类型。

请注意,此方法可用于通过使用特定于驱动程序的Java类型传递特定于数据库的抽象数据类型。如果对象是实现接口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数据类型的列中,并将参数传递给期望JSON值[...]的函数。

(Qazxswpoi)

也就是说,将您的MySQL 5.7 Reference Manual, section 11.6转换为JSON格式的JSONObject,并以此方式将其呈现给您的模板。在检索时,期望必须反过来。

© www.soinside.com 2019 - 2024. All rights reserved.