использовать библиотеку JSON JSON с аннотациями JAXB - PullRequest
3 голосов
/ 19 января 2011

Я пытаюсь включить поддержку аннотаций JAXB в своем веб-приложении на основе RESTEasy, и мне предложили эту статью (http://wiki.fasterxml.com/JacksonJAXBAnnotations). Я могу получить jackson-xc.jar, но не вижу, как зарегистрироваться интроспектор аннотаций. В настоящее время RESTEasy автоматически сериализует мои ответы JSON, где будет соответствовать приведенное ниже? В настоящее время RESTeasy автоматически сериализует объект JSON.

Включает jar-файл jackson-xc, который содержит org.codehaus.jackson.xc.JaxbAnnotationIntrospector Зарегистрируйте эту аннотацию интроспектор

    ObjectMapper mapper = new ObjectMapper();
    AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
    // make deserializer use JAXB annotations (only)
    mapper.getDeserializationConfig().setAnnotationIntrospector(introspector);
    // make serializer use JAXB annotations (only)
    mapper.getSerializationConfig().setAnnotationIntrospector(introspector);

Ответы [ 2 ]

2 голосов
/ 19 января 2011

Вам нужно выяснить, как заставить RESTeasy использовать настроенный вами ObjectMapper.JAX-RS предлагает общий способ сделать это через провайдеров, но может быть более простой способ сделать это с помощью RESTeasy.Некоторые реализации JAX-RS также регистрируют интроспектор аннотаций JAXB по умолчанию.

Последнее: вы уверены, что вам нужно использовать аннотации JAXB?Хотя Джексон может их использовать, предпочтительным методом является либо просто использовать базовое соглашение об именах для обнаружения и собственные аннотации Джексона в случае, когда необходимы переопределения.Проблема с JAXB заключается в том, что он специфичен для xml, поэтому при использовании с JSON немного импеданса.

1 голос
/ 20 января 2011

Спасибо за ответ, посмотрю ваши предложения ...

Причина, по которой мы хотим придерживаться аннотаций jaxb, заключается в том, что аннотация @XmlRootElement (name = "userResponse") допускает дополнительный элемент переноса, который мы хотим в наших ответах JSON. Смотрите пример ниже:

Мы хотим получить {"response": {" userResponse ": [{"user": {"businessRegion": "US", "firstName": "joe", "language": "en", "lastName": "smith"}}}]} вместо того, что выводит Джексон в настоящее время, {"response": [{"user": {"businessRegion": "US", "firstName": "joe" , "язык": "ан", "LastName": "кузнец"}}]}. Есть ли способ имитировать @XmlRootElement в Джексоне, не добавляя дополнительный класс-обертку?

Класс пользователя: @XmlAccessorType (XmlAccessType.FIELD) @XmlRootElement (имя = "userResponse") открытый класс UserResponse extends AbstractResponse { пользователь частного пользователя;

...