使用单个JsonView过滤应用程序的每个JAX-RS资源

时间:2012-09-19 15:25:46

标签: java jersey jax-rs jackson

Jackson 2.0允许使用@JsonView过滤JAX-RS资源。

以下示例显示了在资源响应中忽略人员年龄的方法。 不幸的是,每个JAX-RS方法都必须用@JsonView注释。

public class View {
  public static class Public {}
  public static class Private {}
}

public class People {
  @JsonView(View.Public) String name;
  @JsonView(View.Private) int age;
}

@Path("/people")
public class PeopleResource {
  @GET
  @JsonView(View.Public)
  public List<People> get() {
    return peoples.get();
  }

  @GET
  @Path("/id")
  @JsonView(View.Public)
  public People get(@PathParam("id") int id) {
    return people.get(id);
  }
}

我发现全局过滤应用程序资源的唯一方法是使用MixIn。

public class PeopleMixIn {
  @JsonIgnore int age;
}

@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
  private ObjectMapper mapper = new ObjectMapper();

  public ObjectMapperProvider() {
    mapper.addMixInAnnotations(People.class, PeopleMixIn.class);
  }

  public ObjectMapper getContext(Class<?> type) { return mapper; }
}

有没有办法用JsonView配置Jackson的ObjectMapper?或者将过滤器应用于资源/应用程序的每个方法?

1 个答案:

答案 0 :(得分:1)

您可以对Jackson JAX-RS提供程序进行子类化,这是处理资源注释的一段代码。或者,您可以使用StreamingOutput手动使用ObjectWriter,您可以在其中指定要在每次通话时使用的视图。

使用2.0时,目标是减少ObjectMapper具有的状态,因为改变该状态不能以线程安全的方式完成,而ObjectWriter由于不可变的性质而完全是线程安全的。但JAX-RS提供商尚未使用ObjectWriter / ObjectReader

另一个想法:你可以为Jackson JAX-RS provider提交增强请求(RFE),添加这样的功能(“setDefaultView()”?)。这似乎是您用例的最佳解决方案?实现应该非常简单,所以这可以在2.1.0版本中发布,应该会在几周后发布。