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>)
Другие вопросы по тегам