gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:40:54 26 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于java - 使用单个 JsonView 过滤应用程序的每个 JAX-RS 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com