从 apache cxf REST 响应中删除空值字段

remove null value field from apache cxf REST response

我在我的 REST 服务网络容器中使用 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 拦截器和过滤器的信息:

想知道最佳做法是什么?是否有任何我可以更改的可配置设置,而不是实现我自己的文件管理器或拦截器 class?

我正在使用 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>

干杯!

您可以添加

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 

在您的 POJO class 之上。这将忽略那个 class.

的空字段

或者您可以配置 ObjectMapper 使其在全球范围内应用

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

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


更新

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

找到了!
这就是我要找的答案:

查看更新后的 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>