您可以在 JAX-RS 中全局设置 Jackon 的 Include.NON_NULL 吗?

Can you set Jackon's Include.NON_NULL globally in JAX-RS?

我有一个使用 Apache CXF 的 JAX-RS API。最近我从 Jettison 切换到 Jackson (2.7.1) 进行 JSON 处理。我正在使用 JacksonJaxbJsonProvider。

为了帮助过渡,我需要做的一件事是确保不呈现 JSON 中的空字段。为此,我在 class 级别使用以下注释:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Book {
 ...
}

有没有办法全局设置它,这样我就不必将此注释应用于每个 class?

使用 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属性?

您可以包含如下配置:

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

以防万一它对其他人有帮助,在 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"/>