Использование Jackson JSON Views без аннотирования исходного класса бинов - PullRequest
8 голосов
/ 12 декабря 2011

Можно ли как-нибудь использовать Jackson JSON Views или что-то в этом роде, не добавляя аннотации к исходному классу компонента? Я ищу какую-то динамическую / динамическую конфигурацию, чтобы позволить мне сделать нечто подобное.

My bean - это @Entity, упакованный в JAR, который может использоваться несколькими проектами. Я стараюсь не касаться и не переупаковывать совместно используемый JAR из-за изменений пользовательского интерфейса в проектах-потребителях.

В идеале я хотел бы сделать что-то вроде

jsonViewBuilder = createViewBuilder(View.class);
jsonViewBuilder.addProperty("property1");
jsonViewBuilder.addProperty("property2");

заменить

Bean {
  @JsonView(View.class)
  String property1;

  @JsonView(View.class)
  String property2;
}

Есть идеи?

Базовая среда: Spring 3.0, Spring MVC и Glassfish 3.1.1.

1 Ответ

12 голосов
/ 12 декабря 2011

Как насчет использования функции Mix-In?

http://wiki.fasterxml.com/JacksonMixInAnnotations

http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html


import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonView;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY)
        .configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false);
    mapper.getSerializationConfig().addMixInAnnotations(Bar.class, BarMixIn.class);
    mapper.setSerializationConfig(mapper.getSerializationConfig().withView(Expose.class));

    System.out.println(mapper.writeValueAsString(new Bar()));
    // output: {"b":"B"}
  }
}

class Bar
{
  String a = "A";
  String b = "B";
}

abstract class BarMixIn
{
  @JsonView(Expose.class)
  String b;
}

// Used only as JsonView marker.  
// Could use any existing class, like Object, instead.  
class Expose {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...