您可以在 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"/>
我有一个使用 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"/>