gpt4 book ai didi

java - 如何在 Jersey 资源方法中覆盖@JsonView

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:07 25 4
gpt4 key购买 nike

我有一些使用@JsonView 注释设置的 Jersey 资源方法,以便过滤响应中返回的字段。我希望在某些情况下能够用另一个覆盖注释中的 JsonView 集,或者有时完全禁用它。(一些 queryParam 将用于定义应设置哪个 View 进行渲染或是否应禁用它)。有什么想法吗?

最佳答案

您可以使用 the Jackson 2.3 ObjectWriterModifier/ObjectReaderModifier feature 根据资源方法注释在 Jersey 过滤器中自定义 Jackson 对象编写器.

引用the Jersey documentation如何定义过滤器和拦截器。 This question可能对 Jersey 1.x 有帮助。

这是一个示例,它注册了一个 ObjectWriterModifier 线程本地实例,该实例更改了 JAX-RS Jackson 提供程序的 View 类。我没有针对 JAX-RS 实现测试代码,但我相信它应该可以工作(如果不能,请告诉我)。

public class JacksonObjectWriterModifier {

private static class JsonViewOverrider extends ObjectWriterModifier {

private final Class<?> view;

private JsonViewOverrider(Class<?> view) {
this.view = view;
}

@Override
public ObjectWriter modify(EndpointConfigBase<?> endpoint, MultivaluedMap<String, Object> responseHeaders,
Object valueToWrite, ObjectWriter w, JsonGenerator g) throws IOException {
return w.withView(view);
}
}

private static class View1 {
}
private static class View2 {
}

public static class Bean {
@JsonView(View1.class)
public final String field1;
@JsonView(View2.class)
public final String field2;

public Bean(String field1, String field2) {
this.field1 = field1;
this.field2 = field2;
}
}

public static void main(String[] args) throws IOException {
Bean b = new Bean("a", "b");
JacksonJsonProvider provider = new JacksonJsonProvider();
provider.setDefaultView(View1.class);

// commenting the following line falls back to the View1
ObjectWriterInjector.set(new JsonViewOverrider(View2.class));

provider.writeTo(b, Bean.class, null, null, MediaType.APPLICATION_JSON_TYPE, null, System.out);
}

关于java - 如何在 Jersey 资源方法中覆盖@JsonView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21778177/

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