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

时间:2015-07-26 12:06:40

标签: apache rest jackson jax-rs cxf

我在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>

干杯!

2 个答案:

答案 0 :(得分:5)

发现它!
这是我一直在寻找的答案:

请参阅更新的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>

答案 1 :(得分:3)

你可以添加

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 

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

或者您可以配置ObjectMapper,以便全局适用

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

如果您使用后者,则可以将ObjectMapper作为构造函数arg传递给JacksonJsonProviderJacksonJaxbJsonProviderwhichever one you are currently using

<强>更新

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