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

Posted

技术标签:

【中文标题】如何在球衣资源方法中覆盖@JsonView【英文标题】:How to override @JsonView in jersey resource methods 【发布时间】:2014-03-13 17:51:51 【问题描述】:

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

【问题讨论】:

目标是为给定的休息服务响应设置一个默认的 jsonview,并能够在需要时覆盖它。 【参考方案1】:

您可以使用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);
    

【讨论】:

我还没试过。优先事项发生了变化,但我保证一有机会就给您反馈。 @AlexKubity 我已经更新了我的问题 - 在泽西过滤器上添加了链接。

以上是关于如何在球衣资源方法中覆盖@JsonView的主要内容,如果未能解决你的问题,请参考以下文章

Jackson - 如何在运行时找到活动的 JsonView

如何在球衣中使用 swagger 和 ResourceConfig?

Gradle:Springboot 覆盖依赖项(球衣和 apache httpclient)

Spring @JsonView 如何使用请求参数或标头

@JsonView

如何从球衣过滤器中排除一些网址?