Могу ли я заставить Джерси использовать натуральную нотацию JSON глобально / по умолчанию? - PullRequest
4 голосов
/ 25 января 2012

Я использую Джерси для создания REST API для сервиса. Я хотел бы иметь возможность принимать и возвращать как JSON, так и XML, и это в основном работает, но мне не нравится «отображенный» вариант JSON по умолчанию, который Джерси любит выплевывать.

Я знаю о более новой «естественной» нотации (из http://jersey.java.net/nonav/documentation/latest/json.html,, которую я приведу подробно, потому что она делает очевидной проблему со стандартной «отображенной» нотацией):

После некоторого использования отображенной нотации JSON стало очевидно, что нужно настроить все различные вещи вручную, может быть немного проблематичным. Чтобы избежать ручной работы, новая, естественная нотация JSON была представлена ​​в Джерси версии 1.0.2. С натуральной нотацией, Джерси автоматически выяснит, как отдельные элементы должны быть обработан, так что вам не нужно делать какие-либо инструкции конфигурации. Массивы и списки Java отображаются в массивы JSON, даже для одноэлементных случаев. Числа Java и логические значения правильно сопоставлены с числами JSON и логическими значениями, и вам не нужно беспокоиться с атрибутами XML, как и в JSON, они сохраняют исходные имена

и хотел бы использовать его везде, но я не смог понять, как это сделать. Я инстанцирую / настраиваю Джерси с помощью XML-файлов конфигурации Tomcat - я использую то, что я считаю обычным танцем с тегами servlet / servlet-class / init-param - но я не смог найти документацию о том, как это сделать оттуда можно указать параметры JSONConfiguration.

Я также пытался реализовать свой собственный ContextResolver, который применяет JSONJAXBContext, который я создал из Java-кода, где я могу применить JSONConfiguration.natural () (пример этого выглядит так: этот ответ ). Это работает, но только для типов, которые я явно перечисляю в этом коде и передаю конструктору JSONJAXBContext. Этот дополнительный код не только предназначен для написания и поддержки, а также изменения, если я добавляю больше классов данных, но он не работает для таких вещей, как List.

Есть ли способ сказать Джерси просто использовать естественную запись вместо отображенной записи всегда и для всех типов?

1 Ответ

5 голосов
/ 08 марта 2012

Я так и не нашел ответ на реальный вопрос, который я здесь задавал, но вместо этого я нашел простой трехэтапный процесс, который дает тот же конечный результат, который я хотел:

  • добавить Джексон в мой проект
  • настроить Джерси на включение FEATURE_POJO_MAPPING
  • несколько раз ударил себя по голове, потому что это оказалось очень легко.

Документация Джерси упоминает об этом POJOMappingFeature / FEATURE_POJO_MAPPING (это первый пример на странице документа, на который я ссылался в вопросе), но не описывает точно, что это означает, и из того, как этот документ представляет свою информацию, я думал, что это опция (5.1, «Поддержка POJO») была в противоречии с опцией 5.2 («Поддержка JSON на основе JAXB»), которая звучала больше как то, что я хотел. Поэтому я попробовал много других вещей, прежде чем попытался включить FEATURE_POJO_MAPPING.

Но как только я попробовал, все заработало именно так, как я хотел, и мне не пришлось оглядываться назад.

Дополнительным преимуществом этого является то, что Джексон генерирует гораздо лучшие сообщения об ошибках в случае, если клиент передает ему поддельное содержимое JSON, по сравнению с собственной реализацией обработки JSON в Джерси.

...