6

在我的应用程序中,JAXB 输出生成如下:

this.marshalOut(jaxb_Object, fileOutputStream);

这是对生成 XML 文件的 spring Object XML Mapping Marshallers 的方法调用。现在,我也喜欢在这一行之后生成 JSON 文件。任何人都知道使用 JAXB 输入生成 JSON 输出。

我在网上找到了这个示例代码:

ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JacksonAnnotationIntrospector();
// make deserializer use JAXB annotations (only)
mapper.getDeserializationConfig().setAnnotationIntrospector(introspector);
// make serializer use JAXB annotations (only)
mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
mapper.writeValue( outputStream, jaxb_object);

setAnnotationIntrospector弃用,还有其他方法可以解决此问题吗?

4

5 回答 5

8

以下工作(并且不使用任何不推荐使用的构造函数):

ObjectMapper mapper = new ObjectMapper();

AnnotationIntrospector introspector =
    new JaxbAnnotationIntrospector(mapper.getTypeFactory());   

mapper.setAnnotationIntrospector(introspector);

具体来说,这条线

new JaxbAnnotationIntrospector(mapper.getTypeFactory());

使用未弃用的构造函数。我已经对此进行了测试,它成功地处理了 JAXB 注释(例如 @XmlTransient,在我的例子中)。

于 2015-08-12T22:01:07.980 回答
4

您可以按照文档中的说明使用jackson-module-jaxb-annotations来注册JaxbAnnotationModule模块:

JaxbAnnotationModule module = new JaxbAnnotationModule();
// configure as necessary
objectMapper.registerModule(module);

这样做您现在可以同时使用 JAXB 注释和 Jackson 本机注释。

于 2016-06-10T14:48:32.673 回答
2

如果您将 Jackson 更新到 2.0,它不会被弃用:

http://fasterxml.github.com/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/ObjectMapper.html

你可以在这里看到我的配置(Spring):

带有 JAXB 注释的 Spring 3.1.2 中的注册器 MappingJackson2HttpMessageConverter

于 2012-09-24T09:30:26.760 回答
2

对我来说正确的解决方案是:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector());
于 2015-06-12T13:33:17.330 回答
0

根据杰克逊 javadoc:

setAnnotationIntrospector

@Deprecated
public final void setAnnotationIntrospector(AnnotationIntrospector ai)

    Deprecated. Since 1.8, use either withAnnotationIntrospector(AnnotationIntrospector) or Module API instead

    Method for replacing existing annotation introspector(s) with specified introspector. Since this method modifies state of configuration object directly, its use is not recommended

您是否检查了该方法withAnnotationIntrospector(AnnotationIntrospector ai)以查看它是否对您的情况有用?

于 2012-07-12T15:17:53.853 回答