我有一个使用 Apache CXF 的 JAX-RS API。最近,我从 Jetison 切换到 Jackson (2.7.1) 进行 JSON 处理。我正在使用 JacksonJaxbJsonProvider。
为了帮助转换,我需要做的一件事是确保 JSON 中的空字段不会被渲染。为此,我在类级别使用以下注释:
@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 属性?
最佳答案
以防万一它对其他人有帮助,在 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"/>
关于java - 您可以在 JAX-RS 中全局设置 Jackon 的 Include.NON_NULL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367366/