@XmlJavaTypeAdapter и @JsonSerialize [с использованием restEasy/Jersey/Jackson/Mule]

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

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

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

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

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


person electrotype    schedule 21.10.2011    source источник


Ответы (1)


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

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

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

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

person StaxMan    schedule 22.10.2011
comment
У меня около 2 миллионов других вопросов по теме, но ваш ответ отвечает на этот конкретный вопрос. Спасибо! - person electrotype; 24.10.2011
comment
:) Не стесняйтесь проверять [jackson-users.ning.com] или списки рассылки, а также Jackson Wiki [wiki.fasterxml.com/JacksonHome]. Там много информации, даже если она немного дезорганизована. - person StaxMan; 25.10.2011