DATASTAX 1.0.5 Java 드라이버 및 Cassaforte를 사용하여 Cassandra 1.2에서 문자열 화 된 JSON 개체의 맵을 읽을 때 직렬화 된 값 오류가 잘못되었습니다.
-
26-12-2019 - |
문제
저는 Cassaforte 1.3.0-Beta9, Cassandra 1.2 (DataStax) 및 com.datastax.cassandra / Cassandra-Driver-Core 1.0.5 (2.0이 Cassandra 1.2에서는 작동하지 않으므로)를 사용하고 있습니다.다음 스키마가있는 테이블이 있습니다.
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)
)
.
행에 저장된 것의 예입니다.
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
.
devices
열을 읽으려고하면 다음 오류가 발생합니다.
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)
.
위에 표시된 cqlsh를 사용하여 장치 열을 읽지 못하게 할 수 있습니다 (위에 표시된).지도에 저장된 값은 문자열 화 된 JSON 객체입니다.
여기 샘플 워크 플로우가 있습니다 :
(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)
.
RAW CQL 및 Cassaforte를 사용하여 동일한 워크 플로를 시도했으며 결과는
(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)
.
Cassandra 의지도 모음에 JSON 객체가 저장되어야하는 방법에 대한 모든 도움말 및 / 또는 제안은 크게 감사 할 것입니다.
해결책
(Cassaforte Mainterner 여기)
지금 까지이 질문을 보지 못했습니다
1.0.5 버전의 DataStax 드라이버가있는 문제였습니다. Cassaforte는 현재 2.0.0이고, 문제는 Beta12 위 버전을 닫았습니다. 자세한 정보는 다음과 같습니다 : https://github.com/clojurewerkz/cassaforte/issues/41
최신 버전의 Cassaforte를 사용하고 Cassaforte와 함께 번들로 제공되는 Java 드라이버의 버전을 착색하고 있습니다.