我设置了一些带有 @JsonView 注释的球衣资源方法,以便过滤响应中返回的字段。在某些情况下,我希望能够用另一个覆盖注释中设置的 JsonView,或者有时完全禁用它。(一些 queryParam 将用于定义应该为渲染设置哪个视图,或者是否应该禁用它)。有任何想法吗?
问问题
2028 次
1 回答
3
您可以使用Jackson 2.3 ObjectWriterModifier/ObjectReaderModifier 功能基于资源方法注释在球衣过滤器内自定义 Jackson 对象编写器。
请参阅Jersey 文档如何定义过滤器和拦截器。这个问题可能对 Jersey 1.x 有帮助。
这是一个注册 ObjectWriterModifier 线程本地实例的示例,该实例更改了 JAX-RS Jackson 提供程序的视图类。我没有针对 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);
}
于 2014-05-10T11:57:00.737 回答