2017-08-14 119 views
0

我使用Jackson v2.5.3将Java Bean序列化为XML。这个类看起来像:Jackson @XmlRootElement偶尔缺少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的定义。

回答

0

要启用杰克逊JAXB注解的支持,你需要包括这种依赖性杰克逊2.5.3:在您的XmlMapper

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

注册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> 
+0

感谢您了help.My问题是,大多数的时间从豆到XML的searialization是正确的,但偶尔根标签的名字是错的类名称,而不是@XmlRootElement的定义。当JVM运行一段时间后,发生错误,重启JVM后,问题消失。 – phpinfo