我在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>
干杯!
答案 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传递给JacksonJsonProvider
或JacksonJaxbJsonProvider
(whichever one you are currently using)
<强>更新强>
您也可以使用ContextResolver
看here,并像其他任何提供商一样注册ContextResolver
。这将更好地复杂配置。您可能想要这样做。使用ContextResolver
,您不需要使用ObjectMapper
配置JacksonJsonProvider
,但仍需要JacksonJsonProvider
。