Erreur de valeur sérialisée non valide lors de la lecture d'une carte des objets JSON strints de Cassandra 1.2 à l'aide du pilote de DataStax 1.0.5 Java et de Cassaforte
-
26-12-2019 - |
Question
J'utilise Cassaforte 1.3.0-Beta9, Cassandra 1.2 (DataStax) et com.Datastax.cassandra / Cassandra-Driver-Core 1.0.5 (puisque 2.0 ne fonctionne pas avec Cassandra 1.2).J'ai une table avec le schéma suivant:
CREATE TABLE entities (
id text,
address_country text,
address_county text,
address_region text,
address_street_two text,
csv_uploads list<text>,
documents list<text>,
name text,
notes list<text>,
photos list<text>,
project_id text,
property_code text,
property_data text,
retrofit_completion_date text,
metering_point_ids text,
devices map<text,text>,
user_id text,
PRIMARY KEY (id)
)
Ceci est un exemple de ce qui est stocké dans une rangée:
7b237da126d39ccf98f80d78b6145a10828970f8 |
{'b9d88015c84312bf24cef0e7f1a0baf98dbc8d8d':
'{"metadata":{"passivrole":"zone 1 temperature,zone 1 temperature"},
"readings":
[{"type":"temperature","resolution":"120","accuracy":"0.1","period":"INSTANT"},
{"type":"interpolatedTemperatureAir","resolution":100,"accuracy":"0.1","period":"INSTANT"}],
"description":"External air temperature sensor",
"entity-id":"3e0730d4672538307056a30615aaaa333107d94e"}',
'd2fe3dca47b760dd67759a56ee0ebbc2cb3395f4':
'{"metadata":{"passivrole":"zone 1 humidity"},
"readings":[{"type":"blah","resolution":"120","accuracy":"0.1","period":"INSTANT"}],
"description":" air humidity sensor",
"entity-id":"3e0730d4672538307056a30615aaaa333107d94e"}'} |
alice
Lorsque j'essaie de lire la colonne devices
, je reçois l'erreur suivante:
com.datastax.driver.core.exceptions.InvalidTypeException: Invalid serialized value for type map<text, text> (String didn't validate.)
at com.datastax.driver.core.DataType.deserialize(DataType.java:503)
Je peux lire la colonne de périphériques sans problèmes à l'aide de CQLSH (montré ci-dessus).Les valeurs stockées sur la carte sont des objets JSON strints.
Voici le flux de travail de l'échantillon:
(require '[clojurewerkz.cassaforte.client :as cassaclient]
' [clojurewerkz.cassaforte.query :as cassaquery]
' [clojurewerkz.cassaforte.cql :as cql])
;; SELECT on empty devices:
(binding [cassaclient/*default-session* session]
(let [entity (cql/select :entities (cassaquery/where :id "3e0730d4672538307056a30615aaaa333107d94e"))]
(prn "retrieved entity: " entity)))
;; Returns vector of results, no errors:
"retrieved entity: " [{:retrofit_completion_date nil, :notes nil, :property_code "3e49de0-12af-012e-4f3a-12313b0348f8", :devices nil, :name nil, :user_id "alice", :csv_uploads nil, :project_id "0b4f512fb7834a0878252ab144a525d424445ba2", :photos nil, :property_data nil, :metering_point_ids "[\"1\" \"2\"]", :address_street_two nil, :documents nil, :address_region nil, :address_country nil, :address_county nil, :id "3e0730d4672538307056a30615aaaa333107d94e"}]
;; UPDATE using cassaforte:
(binding [cassaclient/*default-session* session]
(cql/update :entities {:devices {"0edf9e09bce895caf0342ac6ae12511555930362" "{:metadata {\"passivrole\" \"zone 1 humidity\"}, :readings [{\"type\" \"tba\", \"resolution\" \"90\", \"accuracy\" \"0.2\", \"period\" \"INSTANT\"}], :description \"lalalala\", :entity-id \"3e0730d4672538307056a30615aaaa333107d94e\"}"}} (cassaquery/where :id "3e0730d4672538307056a30615aaaa333107d94e")))
;; update worked ok, cqlsh (select devices from entities where id = '3e0730d4672538307056a30615aaaa333107d94e';)
;; returns correct map:
;; {'0edf9e09bce895caf0342ac6ae12511555930362': '{:metadata {"passivrole" "zone 1 humidity"}, :readings [{"type" "tba", "resolution" "90", "accuracy" "0.2", "period" "INSTANT"}], :description "lalalala", :entity-id "3e0730d4672538307056a30615aaaa333107d94e"}'}
;; SELECT using cassaforte
(binding [cassaclient/*default-session* session]
(let [entity (cql/select :entities (cassaquery/where :id "3e0730d4672538307056a30615aaaa333107d94e"))]
(prn "retrieved entity: " entity)))
;; Returns this error:
;; InvalidTypeException Invalid serialized value for type map<text, text> (String didn't validate.) com.datastax.driver.core.DataType.deserialize (DataType.java:503)
J'ai essayé le même flux de travail à l'aide de CQL brut et de Cassaforte, et les résultats étaient exactement les mêmes:
(require '[clojurewerkz.cassaforte.client :as cassaclient])
;; SELECT on empty devices:
(cassaclient/execute session "SELECT * FROM entities WHERE id = '3e0730d4672538307056a30615aaaa333107d94e';")
;; Returns vector of results, no errors:
[{:retrofit_completion_date nil, :notes nil, :property_code "3e49de0-12af-012e-4f3a-12313b0348f8", :devices nil, :name nil, :user_id "alice", :csv_uploads nil, :project_id "0b4f512fb7834a0878252ab144a525d424445ba2", :photos nil, :property_data nil, :metering_point_ids "[\"1\" \"2\"]", :address_street_two nil, :documents nil, :address_region nil, :address_country nil, :address_county nil, :id "3e0730d4672538307056a30615aaaa333107d94e"}]
;; UPDATE using cassaforte:
(cassaclient/execute session "UPDATE entities SET devices = {'0edf9e09bce895caf0342ac6ae12511555930362' : '{:metadata {\"passivrole\" \"zone 1 humidity\"}, :readings [{\"type\" \"tba\", \"resolution\" \"90\", \"accuracy\" \"0.2\", \"period\" \"INSTANT\"}], :description \"lalalala\", :entity-id \"3e0730d4672538307056a30615aaaa333107d94e\"}'} WHERE id = '3e0730d4672538307056a30615aaaa333107d94e';")
;; update worked ok, cqlsh (select devices from entities where id = '3e0730d4672538307056a30615aaaa333107d94e';)
;; returns correct map:
;; {'0edf9e09bce895caf0342ac6ae12511555930362': '{:metadata {"passivrole" "zone 1 humidity"}, :readings [{"type" "tba", "resolution" "90", "accuracy" "0.2", "period" "INSTANT"}], :description "lalalala", :entity-id "3e0730d4672538307056a30615aaaa333107d94e"}'}
;; SELECT using cassaforte
(cassaclient/execute session "SELECT * FROM entities WHERE id = '3e0730d4672538307056a30615aaaa333107d94e';")
;; Returns this error:
;; InvalidTypeException Invalid serialized value for type map<text, text> (String didn't validate.) com.datastax.driver.core.DataType.deserialize (DataType.java:503)
Toute aide et / ou suggestions sur la manière dont les objets JSON doivent être stockés dans la collection de cartes de Cassandra seront grandement appréciés.
La solution
(Mainteneur Cassaforte ICI)
n'ai pas vu cette question jusqu'à présent,
C'était un problème avec la version 1.0.5 de DataStax Driver. Cassaforte est actuellement à 2.0.0, la question est fermée avec n'importe quelle version ci-dessus BETA12. Plus d'infos Ici: https://github.com/clojurewerkz/cassaforte/issues/41
Utilisez la dernière version de Cassaforte et essayez de vous coller à la version du pilote Java qui est livré avec Cassaforte et tout ira bien.