gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:40:56 25 4
gpt4 key购买 nike

我有一个使用 Apache CXF 的 JAX-RS API。最近我从 Jettison 切换到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com