【问题标题】:Filter every JAX-RS resources of an application with a single JsonView使用单个 JsonView 过滤应用程序的每个 JAX-RS 资源
【发布时间】:2025-12-06 09:25:01
【问题描述】:

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?或者对资源/应用程序的每个方法都应用过滤器?

【问题讨论】:

  • 您的目的只是为了隐藏响应中的某些属性吗?

标签: java jersey jax-rs jackson


【解决方案1】:

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

在 2.0 中,目标是减少 ObjectMapper 的状态,因为无法以线程安全的方式更改该状态,而 ObjectWriter 由于不可变的性质而完全是线程安全的。但 JAX-RS 提供者尚未使用 ObjectWriter / ObjectReader

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

【讨论】:

  • 我已经按照您的建议提交了this RFE。谢谢。