2017-12-19 7 views
0

JDBCTemplate und MYSQL JSONjava.io.NotSerializableException: org.json.JSONObject

Ich bin ein Rest-Service zu schreiben, wo ich einige Details an MySQL-Tabelle hinzufügen müssen.

Meine MySQL-Tabelle als Spalte area_json als Typ JSON.

bekam ich einen pojo Objekt von Post Anruf in Ruhe Service und ich versuchte es wie

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

mit jdbctemplate einfügen Nachdem ich einen Post-Aufruf Post Mann kann ich die folgenden Fehler

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

Bitte helfen Sie

+1

Was lässt Sie daran denken, dass die Übergabe eines JSONObject als Parameter mithilfe von JdbcTemplate unterstützt wird und das zugrunde liegende JSON-Dokument in einer MySQL JSON-Spalte speichert? Ist das irgendwo dokumentiert? Wenn nicht, würde ich mich nur auf die MySQL-Dokumentation verlassen: https://dev.mysql.com/doc/refman/5.7/en/json.html. Und übergeben Sie ein JSON-Dokument als String (nicht getestet, aber es scheint viel wahrscheinlicher zu sein, entsprechend der Dokumentation). –

Antwort

2

In erster Linie, stellen Sie sicher, eine Version von Connector/J nicht älter als v5.1.37 zu verwenden, wo Unterstützung für den JSON-Datentyp hinzugefügt wurde, und vorzugsweise n o älter als v5.1.40, wodurch einige JSON-Bugs behoben wurden. Aber wenn das ein Problem für dich ist, dann ist es bestenfalls zweitrangig.

Bevor das schon zählt, muss JdbcTemplate Ihr JSONObject Argument verstehen. The particular method you are using Dokumente, dass die variablen Argumente, einschließlich Ihrer JSONObject sind

Argumente, um die Abfrage zu binden (so dass es zu der PreparedStatement zu die entsprechenden SQL-Typ erraten); kann auch SqlParameterValue Objekte enthalten, die nicht nur das Argument Wert angeben, aber die SQL Art auch und

die Waage optional Wenn es die PreparedStatement sagt erraten, kann es nur the two-arg version of PreparedStatement.setObject() bedeuten, die dokumentiert:

Die JDBC-Spezifikation spezifiziert eine Standardzuordnung von Java-Objekt Typen zu SQL-Typen. Das angegebene Argument wird in den entsprechenden SQL-Typ konvertiert, bevor es an die Datenbank gesendet wird.

Beachten Sie, dass diese Methode verwendet werden kann, um datenbankspezifische abstrakte Datentypen zu übergeben, indem ein treiberspezifischer Java-Typ verwendet wird. Wenn das Objekt einer Klasse angehört, die die Schnittstelle SQLData implementiert, sollte der JDBC -Treiber die Methode SQLData.writeSQL aufrufen, um sie in den SQL-Datenstrom zu schreiben. Wenn das Objekt andererseits aus einer Klasse besteht, die Ref, Blob, Clob, NClob, Struct, java.net.URL, RowId, SQLXML oder Array implementiert, sollte der Treiber es als Wert an die Datenbank übergeben des entsprechenden SQL-Typs.

(Hervorhebung hinzugefügt.)

JDBC haben nicht für einen JSON-Datentyp integrierte Unterstützung. Die Dokumente erlauben Connector/J, einen treiberspezifischen Typ entsprechend dem JSON-SQL-Datentyp bereitzustellen, aber nur weil MySQL und Connector/J JSON unterstützen, bedeutet das nicht, dass Sie ein zufälliges JSON-repräsentierendes Objekt aus dem Regal ziehen und präsentieren können zu ihnen, noch in der Tat, dass sie überhaupt einen JSON-spezifischen Java-Datentyp bereitstellen oder unterbringen.Da MySQL anscheinend keine Dokumentation von JDBC-Erweiterungs-APIs in seiner Connector/J developer guide veröffentlicht oder referenziert, bin ich geneigt zu bezweifeln, dass es einen solchen Typ erkennt.

Es scheint also, dass Sie sich auf der gleichen Technik verlassen sollten, was Sie tun würden, wenn sie direkt in die MySQL-SQL-Dialekt Programmierung:

In MySQL, JSON-Werte werden als Zeichenketten geschrieben. MySQL analysiert jede Zeichenfolge , die in einem Kontext verwendet wird, der einen JSON-Wert erfordert, und erzeugt einen Fehler, wenn nicht als JSON gültig ist. Zu diesen Kontexten gehört das Einfügen eines Werts in eine Spalte mit dem JSON-Datentyp und die Übergabe eines Arguments an eine -Funktion, die einen JSON-Wert erwartet [...].

(MySQL 5.7 Reference Manual, section 11.6)

Das heißt, wandeln Sie Ihre JSONObject zu einem JSON-Format String und präsentieren es auf die Vorlage auf diese Weise. Erwarten Sie beim Zurückholen, dass Sie das Gegenteil tun müssen.

Verwandte Themen