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