gpt4 book ai didi

java - 如何在一行代码中配置 JacksonJaxbJsonProvider?

转载 作者:搜寻专家 更新时间:2023-11-01 02:49:15 24 4
gpt4 key购买 nike

我在这样的 REST 应用程序中使用 Jackson 进行 JSON 序列化:

import javax.ws.rs.core.Application;

import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.SerializationConfig;

public class MyApplication extends Application {

public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(MyResource1.class);
classes.add(MyResource2.class);
...
return classes;
}

public Set<Object> getSingletons() {
Set<Object> singletons = new HashSet<Object>();
singletons.add(new JacksonJaxbJsonProvider().configure(
SerializationConfig.Feature.WRITE_NULL_PROPERTIES, false)); // (*)
return singletons;
}

}

(*) 必要的否则用@XmlElementRef 注释的字段将在 JSON 输出中显示为 "myField": null 当 null 时(而不是不出现),而用 @XmlElement 注释的字段很好。

然而,SerializationConfig.Feature.WRITE_NULL_PROPERTIES 的使用已被弃用,取而代之的是 SerializationConfig.setSerializationInclusion(..) (1)它本身已被弃用,取而代之的是 SerializationConfig.withSerializationInclusion(..)通过 ObjectMapper 配置 (2)

但我认为使用 new JacksonJaxbJsonProvider().configure(..) 确实是在配置一个 ObjectMapper(我看了一下代码)。

所以我的问题是:如何在不使用任何已弃用的属性且不(重新)创建新的配置类的情况下正确配置它?

(1) http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/SerializationConfig.Feature.html#WRITE_NULL_PROPERTIES

(2) http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/SerializationConfig.html#setSerializationInclusion(org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion)

最佳答案

我使用下一个配置和 OM:

public class JaxbJacksonObjectMapper extends ObjectMapper {

public JaxbJacksonObjectMapper() {
configure(Feature.WRAP_ROOT_VALUE, false); // IMPORTANT must be false
configure(Feature.WRITE_EMPTY_JSON_ARRAYS, true);
configure(Feature.WRAP_EXCEPTIONS, true);
configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

final AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();

super.getSerializationConfig().withSerializationInclusion(Inclusion.ALWAYS);
super.getDeserializationConfig()
.withAnnotationIntrospector(introspector);
super.getSerializationConfig()
.withAnnotationIntrospector(introspector);

}

}

希望对你有帮助

更新:对不起,我忘了下一部分。您还需要注册它,例如:

@Provider
public final class ReContextResolver implements ContextResolver<ObjectMapper> {

private final ObjectMapper jacksonObjectMapper;

public ReContextResolver() throws Exception {
jacksonObjectMapper = new JaxbJacksonObjectMapper();
}

@Override
public ObjectMapper getContext(final Class<?> objectType) {
return jacksonObjectMapper;
}

}

你可以把它合并到一个类中,对我来说——我使用 POJO 映射和直接解析,所以对我来说它更好。

关于java - 如何在一行代码中配置 JacksonJaxbJsonProvider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14704959/

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