Проблема представления JSON с освободителем - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь определить действительно простой ресурс с помощью Liberator. Чтобы начать с минимального примера, я написал такой обработчик:

(resource
  :handle-ok {:hello "world"})

Но, несмотря на четкую передачу значения (это не ноль), я получил следующее исключение:

java.lang.IllegalArgumentException: в мультиметоде 'render-map-generic' нет метода для значения отправки: null.

И эта проблема присутствовала и в моем реальном ресурсе, поэтому я попытался объяснить, как она должна представлять карту, и включил: :available-media-types ["application/json"]:

(resource
  :available-media-types ["application/json"]
  :handle-ok {:hello "world"})

Теперь это работает (удивило меня, что я должен был это сделать), но теперь, когда я указываю, что ресурс не существует, я получаю действительно странную ошибку response (не исключение). И продемонстрировать, что:

(resource
  :available-media-types ["application/json"]
  :exists? false
  :handle-ok {:hello "world"})

Теперь я получаю 404 (что я ценю) со следующим телом ответа:

Произошла ошибка при разборе данных JSON

Неожиданный токен R в JSON в позиции 0

А вот и x-liberator-trace:

: решение (: initialize-context {}); : решение (: услуга доступна? верно); : решение (: известный метод?: получить); : 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», он работает безупречно. Я также задавался вопросом, является ли это регрессией, поэтому я проверил пару версий назад, но те же результаты.

...