如何在jersey资源方法中覆盖@JsonView

时间:2014-02-14 11:28:50

标签: java jersey jackson jax-rs json-view

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

1 个答案:

答案 0 :(得分:3)

您可以使用the Jackson 2.3 ObjectWriterModifier/ObjectReaderModifier feature基于资源方法注释在球衣过滤器内自定义Jackson对象编写器。

请参阅the Jersey documentation如何定义过滤器和拦截器。 This question对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);
    }