java.io.NotSerializableException: org.json.JSONObject

0

JDBCTemplate и MYSQL JSON

Я пишу службу отдыха, где мне нужно добавить несколько деталей в таблицу mysql.

Моя таблица mysql как столбец area_json как тип json.

Я получил объект pojo из почтового вызова в службе отдыха, и я попытался вставить его с помощью jdbctemplate, например

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

Как только я делаю почтовый вызов с помощью почтового ящика, я получаю следующую ошибку

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

Пожалуйста помоги

Теги:
rest

1 ответ

3

Во-первых, обязательно используйте версию Connector/J не старше v5.1.37, где была добавлена поддержка типа данных JSON и, желательно, не старше v5.1.40, что устраняет некоторые связанные с JSON ошибки. Но если это проблема для вас, то она в лучшем случае вторична.

До этого даже важно, JdbcTemplate должен понимать ваш аргумент JSONObject. В конкретном методе, в котором используются документы, переменные аргументы, включая JSONObject,

аргументы для привязки к запросу (оставляя его в PreparedStatement для угадывания соответствующего типа SQL); могут также содержать объекты SqlParameterValue которые указывают не только значение аргумента, но также тип SQL и, необязательно, масштаб

Когда он говорит, что PreparedStatement угадает, это может означать только версию с двумя аргументами PreparedStatement.setObject() которая содержит документы:

Спецификация JDBC указывает стандартное сопоставление типов объектов Java с типами SQL. Данный аргумент будет преобразован в соответствующий тип SQL перед отправкой в базу данных.

Обратите внимание, что этот метод может использоваться для передачи специфических абстрактных типов данных datatabase- с использованием специфичного для драйвера типа 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, похоже, не публикует и не ссылается на какую-либо документацию API расширения JDBC в своем руководстве разработчика Connector/J, я склонен сомневаться в том, что он распознает любой такой тип.

Похоже, что вам следует полагаться на ту же технику, что и при программировании непосредственно на диалоговом языке SQL SQL:

В MySQL значения JSON записываются как строки. MySQL анализирует любую строку, используемую в контексте, который требует значения JSON, и выдает ошибку, если он недействителен как JSON. Эти контексты включают вставку значения в столбец с типом данных JSON и передачу аргумента функции, ожидающей значения JSON [...].

(Справочное руководство по MySQL 5.7, раздел 11.6)

То есть, конвертировать JSONObject в JSON-формате String, и представить его в шаблон таким образом. При извлечении ожидайте сделать обратное.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню