我有一个使用Apache CXF的JAX-RS API。最近我从Jettison切换到Jackson(2.7.1)进行JSON处理。我正在使用JacksonJaxbJsonProvider。
我需要做的一件事就是确保转换中的空字段不会被渲染。为此,我在课程级别使用以下注释:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Book {
...
}
有没有办法全局设置它,所以我不必将这个注释应用到每个类?
使用Jettison,我能够在beans.xml文件中指定属性,Jackson是否有类似的方法来实现NON_NULL行为?
<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
<property name="dropRootElement" value="true"/>
<property name="supportUnwrapped" value="true"/>
</bean>
我已经看到在实例化时在ObjectMapper级别设置此属性的一些建议,但是当使用Apache CXF时,我从不手动创建ObjectMapper,因为此实例化由框架处理(可能发生在JacksonJaxbJsonProvider中的某处)。
有没有办法全局设置NON_NULL属性?
答案 0 :(得分:1)
您可以包含以下配置:
<bean id="jacksonJaxbJsonProvider"
class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider">
<constructor-arg ref="objectMapper"></constructor-arg>
</bean>
<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="serializationInclusion" value="NON_NULL"></property>
</bean>
答案 1 :(得分:1)
以防万一它可以帮助其他人,在beans.xml中配置ObjectMapper与NON_NULL一起工作但是我的JAXB注释停止工作。为了让它们同时工作,我使用了创建自己的ObjectMapper提供程序:
@Provider
public class CustomJacksonObjectMapperProvider implements ContextResolver<ObjectMapper> {
final ObjectMapper defaultObjectMapper;
public CustomJacksonObjectMapperProvider() {
defaultObjectMapper = createDefaultMapper();
}
@Override
public ObjectMapper getContext(Class<?> type) {
return (defaultObjectMapper);
}
private static ObjectMapper createDefaultMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setAnnotationIntrospector(
AnnotationIntrospector.pair(
new JacksonAnnotationIntrospector(),
new JaxbAnnotationIntrospector(mapper.getTypeFactory())
));
return (mapper);
}
}
并在beans.xml(jaxrs:providers
下)注册,如下所示:
<bean id="customJacksonObjectMapperProvider" class="CustomJacksonObjectMapperProvider"/>