【问题标题】:remove null value field from apache cxf REST response从 apache cxf REST 响应中删除空值字段
【发布时间】:2015-10-16 16:12:30
【问题描述】:

我在我的 REST 服务 Web 容器中使用 apache-cxf 2.7.11 + jackson (codehaus) 1.9.13 + spring 3.5。我想知道从 REST 响应中删除 null 值字段的最佳方法是什么。

例如:
我现在的回复是这样的:

{
 "name": "MyName",
 "age": 10,
 "address": null
}

我希望我的回复是这样的(address 字段已被删除):

{
 "name": "MyName",
 "age": 10
}

我在这里阅读了apache-cxf 拦截器和过滤器:

想知道最佳实践是什么?有没有我可以更改的可配置设置,而不是实现我自己的文件管理器或拦截器类?

我正在使用beans.xml 文件进行配置,因此我正在寻找如何在这里配置它,我的 bean 所在的位置:

<bean id="jaxrsRestJacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>

<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider">
    <property name="mapper" ref="jaxrsRestJacksonObjectMapper"/>
</bean>


<jaxrs:server id="restContainer" address="/">
        <jaxrs:serviceBeans>

        </jaxrs:serviceBeans>
        <jaxrs:providers>
            <ref bean="jsonProvider"/>
        </jaxrs:providers>

</jaxrs:server>

干杯!

【问题讨论】:

    标签: apache rest jackson jax-rs cxf


    【解决方案1】:

    你可以添加

    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 
    

    在您的 POJO 类之上。这将忽略该类的空字段。

    或者您可以配置 ObjectMapper 使其全局应用

    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
    

    如果你选择后者,你可以将 ObjectMapper 作为构造函数 arg 传递给 JacksonJsonProviderJacksonJaxbJsonProvider (whichever one you are currently using)


    更新

    您也可以使用ContextResolver,如here 所示,并像注册任何其他提供商一样注册ContextResolver。这将更好地工作更复杂的配置。您可能想要这样做。使用ContextResolver,您无需将ObjectMapper 配置为JacksonJsonProvider,但您仍然需要JacksonJsonProvider

    【讨论】:

    • 应该递归地在对象上工作吗?例如我有一个 Person 类列表
    • 如果没有测试,我只会说我会这样想(至少使用 ObjectMapper 路由)。你试过了吗?
    • 是的,它正在按预期递归地处理对象。您的回答帮助我找到了我必须在我的 xml 配置文件中设置的确切值。我用 xml 文件配置发布了一个答案。
    • 您也可以使用 ContextResolver,如 here 所见,并像注册任何其他提供商一样注册 ContextResolver。这将更好地工作更复杂的配置。您可能想要这样做。我打算将它添加到我的答案中但变得懒惰:-) 使用 ContextResolver,您不需要使用 JacksonJsonProvider 配置 ObjectMapper,但您仍然需要 JacksonJsonProvider
    • 另一种选择是扩展 JacksonJsonProvider,您可以在构造函数中配置 ObjectMapper。 xml 越少越好:-)
    【解决方案2】:

    找到了!
    这是我一直在寻找的答案:

    查看更新后的beans.xml 文件:

    <bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper">
        <property name="serializationInclusion" value="NON_NULL"/>
    </bean>
    
    <bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider">
        <property name="mapper" ref="jacksonObjectMapper"/>
    </bean>
    

    【讨论】:

      猜你喜欢
      • 2015-01-16
      • 2021-03-21
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 2013-08-22
      相关资源
      最近更新 更多