【问题标题】:java.io.NotSerializableException: org.json.JSONObjectjava.io.NotSerializableException: org.json.JSONObject
【发布时间】:2017-12-19 20:00:23
【问题描述】:

JDBCTemplate 和 MYSQL JSON

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

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

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

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

一旦我使用 post man 进行 post call,我会收到以下错误

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

请帮忙

【问题讨论】:

  • 是什么让您认为使用 JdbcTemplate 将 JSONObject 作为参数传递是受支持的,并将底层 JSON 文档存储在 MySQL json 列中?这是在某处记录的吗?如果没有,我只会依赖 MySQL 文档:dev.mysql.com/doc/refman/5.7/en/json.html。并将 JSON 文档作为字符串传递(未经测试,但根据文档似乎更有可能成功)。

标签: java mysql rest


【解决方案1】:

首先,确保使用不早于 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 类型。如果 object 是一个实现接口 SQLData 的类,JDBC 驱动程序应调用方法 SQLData.writeSQL 将其写入 SQL 数据流。另一方面,如果对象属于某个类 实现 Ref、Blob、Clob、NClob、Struct、java.net.URL、RowId、 SQLXML 或数组,驱动程序应将其作为值传递给数据库 对应的 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 值的函数 [...]。

(MySQL 5.7 Reference Manual, section 11.6)

也就是说,将您的 JSONObject 转换为 JSON 格式的 String,然后以这种方式将其呈现给您的模板。在检索时,预计必须执行相反的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 2013-07-11
    • 2013-01-03
    • 2013-09-13
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多