Проблема представления JSON с освободителем
Я пытаюсь определить действительно простой ресурс с помощью Liberator. Чтобы начать с минимального примера, я написал такой обработчик:
(resource
:handle-ok {:hello "world"})
Но, несмотря на четкую передачу значения (это не ноль), я получил следующее исключение:
java.lang.IllegalArgumentException
: Нет метода в multimethod 'render-map-generic' для значения отправки: null.
И эта проблема присутствовала и в моем реальном ресурсе, поэтому я попытался четко указать, как она должна представлять карту, и я добавил: :available-media-types ["application/json"]
:
(resource
:available-media-types ["application/json"]
:handle-ok {:hello "world"})
Теперь это работает (удивило меня, я должен был это сделать), но теперь, когда я указываю, что ресурс не существует, я получаю действительно странный ответ об ошибке (не исключение). И продемонстрировать, что:
(resource
:available-media-types ["application/json"]
:exists? false
:handle-ok {:hello "world"})
Теперь я получаю 404 (что я ценю) со следующим телом ответа:
Произошла ошибка при разборе данных JSON
Неожиданный токен R в JSON в позиции 0
И вот x-liberator-trace
:
: решение (: инициализировать-контекст {});: решение (: услуга доступна? верно);: решение (: известный метод?: получить);: solution (: uri-too-long? false);: решение (: метод-разрешен?: получить);: решение (: неправильно сформировано? ложно);: решение (: разрешено? верно);: решение (: разрешено? верно);: solution (: valid-content-header? true);: решение (: известный-тип-контента? верно);: solution (: valid-entity-length? true);: решение (: is-options? false);: решение (: принять-существует? [false {: представление {: медиа-тип "application/json"}}]);: решение (: принять-язык-существует? ноль);: решение (: принять-кодировка-существует? ноль);: решение (: принять-кодирование-существует? ноль);: решение (: обрабатываемый? верно);: решение (: существует? ложь);: решение (: если-матч-звезда-существует-пропущено? ложь);: решение (: метод-положить? ложь);: решение (: существовало? ложно);: решение (: после пропущенного? ложно);: handler (: handle-not-found)
И вы можете предположить, что я мог бы просто взломать свой выход и определить :handle-not-found
обработчик, и у меня есть, но это просто полностью перекрывается этим ответом.
Я не уверен, что это ошибка или я просто не правильно использую Liberator. С таким простым примером, я предполагаю, что это последний. Но с другой стороны, когда я использую вместо этого "application / edn", это работает безупречно. Я также задавался вопросом, является ли это регрессией, поэтому я проверил пару версий назад, но те же результаты.