Como serializar condicionalmente com JAXB ou Jackson? Vista Externa vs Vista Interna
Estou criando uma API RESTful e tenho um caso de uso em que preciso renderizar duas visualizações diferentes dos meus dados. Uma que podemos usar internamente e outra que exporemos externamente. Além disso, minha API precisa suportar XML e JSON.
Para minha resposta JSON, isso é extremamente fácil de se fazer com Jackson. Posso incluir condicionalmente campos em minha resposta JSON usando o recurso JsonViews:http://wiki.fasterxml.com/JacksonJsonViews
Primeiro você precisa criar uma classe simples especificando seus pontos de vista:
public class Views {
public static class External {}
public static class Internal extends External {}
}
Agora, com as minhas aulas de visualização, anotei meus campos com os quais eles parecem pertencer:
@JsonView(Views.External.class)
private String external = "External";
@JsonView(Views.Internal.class)
private String internal = "Internal";
Você pode então serializar o objeto e especificar qual visão você quer usar:
ObjectMapper jsonMapper = new ObjectMapper();
ObjectWriter externalWriter = jsonMapper.writerWithView(Views.External.class);
String externalJson = externalWriter.writeValueAsString(new ResponseObject());
Isso funciona bem para JSON, mas infelizmente o mesmo não é suportado para XML. Como posso conseguir o mesmo com XML? Estou disposto a usar o JAXB, se necessário, para minha conversão XML.