Clojure RuntimeException - Нет функции читателя для тега db/id
Что происходит, когда я получаю эту ошибку в Clojure?
java.lang.RuntimeException: No reader function for tag db/id
1 ответ
Помеченные литералы
Это сообщение об ошибке связано с функцией, добавленной в Clojure 1.7, с тегами литералов. Помеченные литералы являются простым средством расширения типов данных, которые могут быть представлены как литералы в коде Clojure или данных EDN.
Clojure поставляется с читателями для двух помеченных литералов, #inst
а также#uuid
позволяя буквальные представления java.util.Date
а такжеjava.util.UUID
, Поддержка дополнительных тегов может быть добавлена путем включенияdata_readers.clj
файлы на пути к классам, как описано в документации.
Общие причины
Некоторые распространенные причины этой ошибки:
- Попытка прочитать данные Datomic транзакции, содержащие
#db/id
литералы - При попытке использовать читатель EDN без прохождения
:readers
- В задачах загрузки, которые пытаются использовать EDN Reader, передавая
*data-readers*
,
Использование читателя EDN
Одной из распространенных причин этой ошибки является попытка использования считывателя EDN без передачи :readers
вариант. Из строки документа дляclojure.edn/read
:
:readers - a map of tag symbols to data-reader functions to be
considered before default-data-readers. When not
supplied, only the default-data-readers will be used.
Как следует из названия, default-data-readers
это только карта считывателей данных, которые поставляются вместе с Clojure. То есть он не включает в себя каких-либо читателей, определенных в data_readers.clj
файлы любых библиотек, которые вы используете (например, Datomic). Решением в этом случае является передача текущего набора загруженных считывателей данных, найденных в var*data-readers*
,
(clojure.edn/read {:readers *data-readers*} <your-read-source>)
Или, что еще лучше, явно укажите отображение читателей данных, которые вы хотите использовать. Например, если вы хотите использовать только устройства чтения двухатомных данных:
(require 'datomic.db
'datomic.function
'datomic.codec)
(edn/read {:readers {'db/id datomic.db/id-literal
'db/fn datomic.function/construct
'base64 datomic.codec/base-64-literal}}
<your-read-source-here>)
И, конечно же, поскольку мы имеем дело только с замыкающими картами, мы могли бы также включить default-data-readers
объединяя карты:
(require 'datomic.db
'datomic.function
'datomic.codec)
(edn/read {:readers (merge
default-data-readers
{'db/id datomic.db/id-literal
'db/fn datomic.function/construct
'base64 datomic.codec/base-64-literal})}
<your-read-source-here>)