Я использую Jersey для реализации JAX-RS REST-сервисов наряду с Jackson 2.0.2 для сопоставления JSON. Один из этих REST-сервисов возвращает List<EntityA> (позвоните ему indexA), где EntityA содержит еще один List<EntityB>, тогда как другая служба просто возвращает List<EntityB> (пусть назовите его indexB):
@Entity
@JsonAutoDetect
public class EntityA {
@Id
private String id;
@OneToMany
private List<EntityB> 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<EntityA> indexA() {
...
}
}
@Path("/b")
public class BResource {
@GET
@Path("/")
public List<EntityB> indexB() {
...
}
}
То, что я хотел бы достичь, - применить фильтр Джексона к вызову indexA, чтобы не все атрибуты дочерних элементов EntityB были сериализованы. OTOH, indexB должен возвращать EntityB в своей полноте.
Мне известно о существовании ContextResolver<ObjectMapper>, которое я уже использую для других целей. К сожалению, для ContextResolver, как представляется, невозможно отличить обе служебные вызовы, поскольку Class, поставляемый в ContextResolver.getContext(Class), равен ArrayList в обоих случаях (и благодаря стиранию типа я не могу определить параметры типового типа).
Есть ли какие-либо крючки, лучше подходящие при настройке ObjectMapper/FilterProvider в зависимости от типа объекта, который отображается?
Я мог бы использовать подход, предложенный в Как вернуть частичный ответ JSON с помощью Java?: Вручную сопоставление с String, но это убивает всю красоту декларативный подход, основанный на аннотациях, поэтому я хотел бы избежать этого.