Как условно сериализовать с JAXB или Джексоном? Внешний вид против внутреннего вид

Я создаю RESTful API, и у меня есть сценарий использования, когда мне нужно иметь возможность отображать два разных представления моих данных. Тот, который мы можем использовать внутри, и тот, который мы выставим снаружи. Кроме того, мой API должен поддерживать как XML, так и JSON.

Для моего ответа JSON это очень легко сделать с Джексоном. Я могу условно включить поля в свой JSON Response, используя функцию JsonViews:http://wiki.fasterxml.com/JacksonJsonViews

Сначала вам нужно создать простой класс, определяющий ваши представления:

public class Views {

    public static class External {}

    public static class Internal extends External {}
}

Теперь с моими классами представления я просто аннотирую свои поля, которым они принадлежат, примерно так:

    @JsonView(Views.External.class)
    private String external = "External";

    @JsonView(Views.Internal.class)
    private String internal = "Internal";

Затем вы можете сериализовать объект и указать, какое представление вы хотите использовать:

    ObjectMapper jsonMapper = new ObjectMapper();
    ObjectWriter externalWriter = jsonMapper.writerWithView(Views.External.class);
    String externalJson = externalWriter.writeValueAsString(new ResponseObject());

Это хорошо работает для JSON, но, к сожалению, то же самое в настоящее время не поддерживается для XML. Как я могу добиться того же с XML? Я готов использовать JAXB при необходимости для моего преобразования XML.

Ответы на вопрос(2)

Я смог заставить это работать, добавив новую библиотеку для переопределения по умолчанию:

        
        
            com.fasterxml.jackson.core
            jackson-databind
            2.0.6
        
        
            com.fasterxml.jackson.dataformat
            jackson-dataformat-xml
            2.0.5
        
        
            com.fasterxml
            aalto-xml
            0.9.8
        

Так что теперь я могу сериализовать в JSONа также XML с использованием Jackson и их функциональности @JsonView. Очень чистый! Тот, который я добавил, был aalto-xml.

 nwallman18 окт. 2012 г., 18:09
Правильно, я должен был упомянуть и это тоже.
 StaxMan18 окт. 2012 г., 18:05
Для полноты картины также упомяну, что Woodstox (woodstox.codehaus.org) - это еще один модуль Stax, который работает хорошо - увы, у JJK-связанного SJSXP есть некоторые проблемы, с которыми XML-модуль не может обойтись (особенно при добавлении отступа)

Примечание: ямEclipseLink JAXB (МОКСИ) привести и членJAXB (JSR-222) экспертная группа.

EclipseLink JAXB (MOXy) предлагает внешний файл сопоставления. Этот файл сопоставления может дополнять или полностью заменять метаданные, предоставляемые аннотациями. Ниже приведен пример, в котором одна и та же объектная модель сопоставлена с двумя разными метеорологическими службами (Google и Yahoo).

http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml-schemas.html

MOXy также поддерживает привязку XML и JSON:

http://blog.bdoughan.com/2011/08/binding-to-json-xml-geocode-example.html

MOXy также легко интегрируется с реализациями JAX-RS:

http://blog.bdoughan.com/2012/05/moxy-as-your-jax-rs-json-provider.html
 nwallman17 окт. 2012 г., 22:37
Спасибо за информацию! Я должен быть честным, хотя я действительно немне нравится идея управления XML-файлом в дополнение к моему POJO для применения "Просмотры", С этой точки зрения ДжексонПоддержка этой функции очень элегантна. Сказав это, во всех моих исследованиях я нене нашел лучшего решения, чем выя предложил.

Ваш ответ на вопрос