2017-08-14 32 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