@XmlJavaTypeAdapter vs. @JsonSerialize [с использованием restEasy / Jersey / Jackson / Mule] - PullRequest
1 голос
/ 21 октября 2011

Я новичок во всем, что касается JAXB / JAX-RS. На работе мы используем Mule ESB с модулем Джерси / Джексона для приема входящих REST-запросов. На стороне клиента мы используем RestEasy (с Джексоном) ... Запрос должен быть в Json, а не в XML.

Хорошо работает для простых объектов, содержащих только строковые поля. Но как только мы начинаем использовать более «сложные» типы, например Locales , enums или Maps , возникают проблемы.

Если я правильно понимаю, в JAXB нет встроенных сериализаторов для таких типов, как Map (я бы даже сказал «HashMap», поскольку JAXB не поддерживает интерфейсы, если я правильно понимаю). Таким образом, вы должны предоставить свои собственные сериализаторы для этих полей.

Из моих поисков в Интернете я обнаружил, что аннотация @ XmlJavaTypeAdapter может использоваться для управления вашей собственной сериализацией типа типа «Карта». Но я также вижу в документации Джексона, что можно использовать аннотацию @ JsonSerialize (используя = MySerializer.class) .

Что мы должны использовать и почему? @ XmlJavaTypeAdapter или @ JsonSerialize ? Они одинаковые или имеют разные цели?

1 Ответ

2 голосов
/ 22 октября 2011

Прежде всего: Джексон полностью поддерживает все структурированные типы JDK, включая Карты, поэтому обычно не требуется никакой специальной конфигурации или аннотаций. Джексон не является реализацией JAXB или ограничен ограничениями JAXB (которые основаны на проблемах отображения между POJO и XML, которые несколько больше, чем у JSON).

Джексон также хорошо поддерживает интерфейсы; для сериализации вам редко нужно что-то дополнительное. Для десериализации вы можете или не можете нуждаться; и есть несколько способов указать конкретные реализации; но обычно вам не нужно определять собственные сериализаторы или десериализаторы.

Так что, возможно, ответ таков: вам тоже не нужно.

Теперь: поддержка JAXB - это дополнительная возможность совместимости для Джексона, в основном предназначенная для поддержки устаревших вещей, где JAXB используется или использовался для XML. Собственные аннотации Джексона являются предпочтительным механизмом, если вы не начинаете с аннотаций JAXB. Поэтому, если вам не нужны аннотации JAXB для других целей (чтение / запись XML), я бы предложил просто использовать @JsonSerialize Джексона, если конфигурация на основе аннотаций действительно необходима.

...