Применение различных фильтров Джексона для различных вызовов службы REST Джерси

Я использую Jersey для реализации JAX-RS REST-style сервисов вместе с Jackson 2.0.2 для сопоставления JSON. Одна из этих служб REST возвращает List(назовем его indexA), где EntityAсодержит другой List, тогда как другой сервис просто возвращает List(назовем его indexB):

@Entity
@JsonAutoDetect
public class EntityA {
  @Id
  private String id;

  @OneToMany
  private List b;

  ...
}

@Entity
@JsonAutoDetect
@JsonFilter("bFilter")
public class EntityB {
  @Id
  private String id;

  private String some;
  private String other;
  private String attributes;

  ...
}

@Path("/a")
public class AResource {

  @GET
  @Path("/")
  public List indexA() {
    ...
  }
}

@Path("/b")
public class BResource {

  @GET
  @Path("/")
  public List indexB() {
    ...
  }
}

Чего я хотел бы добиться, так это применить фильтр Джексона к indexA таким образом, чтобы не все атрибуты дочерних элементов EntityBбыли сериализованы. OTOH, indexBдолжен возвращать EntityBв полном объеме.

Мне известно о существовании ContextResolver, который я уже использую для других целей. К сожалению, для ContextResolverневозможно различить оба вызова службы, поскольку Class, предоставленный ContextResolver.getContext(Class), представляет собой ArrayListв обоих случаях (и из-за стирания типа я не могу понять параметры универсального типа).

Существуют ли какие-либо хуки, которые лучше подходят для настройки ObjectMapper/ FilterProviderв зависимости от типа отображаемой сущности?

Я мог бы использовать подход, предложенный в Как вернуть частичный ответ JSON с помощью Java?: ручное сопоставление с строкой, но это убивает всю красоту декларативной аннотации- основанный на подходе, поэтому я хотел бы избежать этого.

13
задан Community 23 May 2017 в 10:29
поделиться