你能在JAX-RS中全局设置Jackon的Include.NON_NULL吗?

时间:2016-02-12 16:20:32

标签: java json jackson jax-rs cxf

我有一个使用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属性?

2 个答案:

答案 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"/>