Я использую 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
, но это убивает всю красоту декларативный подход, основанный на аннотациях, поэтому я хотел бы избежать этого.