偶尔会缺少XML的@XmlRootElement

时间:2017-08-14 03:18:56

标签: xml jackson

我正在使用Jackson v2.5.3将Java Bean序列化为XML。该课程如下:

@XmlRootElement(name="ROOT")
public class classA{
    @XmlElement
    String aString;
    @XmlElement
    String bString;
}

我遇到的问题是偶尔会收到XML输出:

<?xml version="1.0" encoding="utf-8"?>
<classA>
    <aString></aString>
    <bString></bString>
</classA>

我们期望的应该是:

<?xml version="1.0" encoding="utf-8"?>
<ROOT>
    <aString></aString>
    <bString></bString>
</ROOT>

似乎根节点名称错误。使用了类名而不是@XmlRootElement的定义。

1 个答案:

答案 0 :(得分:0)

要在Jackson中启用对JAXB注释的支持,您需要在Jackson 2.5.3中包含此依赖项:

<dependency>
  <groupId>com.fasterxml.jackson.module</groupId>
  <artifactId>jackson-module-jaxb-annotations</artifactId>
  <version>2.4.0</version>
</dependency>

在XmlMapper中注册JaxbAnnotationModule模块。

XmlMapper xmlMapper = new XmlMapper();
JaxbAnnotationModule module = new JaxbAnnotationModule();
xmlMapper.registerModule(module);
杰克逊2.5.3产生了这个XML:

<ROOT xmlns="">
    <aString/>
    <bString/>
</ROOT>
杰克逊2.9.0产生了这个XML:

<ROOT>
    <aString/>
    <bString/>
</ROOT>

为了进一步完全渲染,您需要自定义序列化。

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

class EmptySerializer extends JsonSerializer<Object> {

    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeString("");
    }
}

并在您的映射器中注册:

    XmlSerializerProvider provider = new XmlSerializerProvider(new XmlRootNameLookup());
    provider.setNullValueSerializer(new EmptySerializer());
    xmlMapper.setSerializerProvider(provider);

这会产生您想要的格式。

<ROOT>
    <aString></aString>
    <bString></bString>
</ROOT>