2017-08-14 2 views
0

Ich benutze Jackson v2.5.3, um eine Java-Bean zu XML zu serialisieren. Die Klasse wie folgt aussieht:Jackson @ XmlRootElement für XML gelegentlich fehlt

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

Das Problem, das ich begegnet bin ist, dass ich die XML-Ausgabe von gelegentlich erhalten:

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

Was erwarten wir sein sollten:

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

Es scheint, Dieser Name des Stammknotens ist falsch. Der Klassenname wurde anstelle der Definition von @XmlRootElement verwendet.

Antwort

0

Unterstützung in Jackson für JAXB Anmerkungen zu aktivieren, müssen Sie diese Abhängigkeit für Jackson 2.5.3 enthalten:

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

Register JaxbAnnotationModule Modul in Ihrem XmlMapper.

XmlMapper xmlMapper = new XmlMapper(); 
JaxbAnnotationModule module = new JaxbAnnotationModule(); 
xmlMapper.registerModule(module); 

Jackson 2.5.3 produziert diese XML:

<ROOT xmlns=""> 
    <aString/> 
    <bString/> 
</ROOT> 

Jackson 2.9.0 produziert diese XML:

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

dies weiter zu nehmen, genau zu machen, wie Sie auf dem Laufenden, was Sie brauchen um die Serialisierung anzupassen.

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(""); 
    } 
} 

Und registrieren Sie dies mit Ihrem Mapper:

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

Dies erzeugt das gewünschte Format.

<ROOT> 
    <aString></aString> 
    <bString></bString> 
</ROOT> 
+0

Dank für Sie kindly help.My Frage ist, dass die searialization von der Bohne bis xml meiste Zeit korrekt ist, aber gelegentlich die Root-Tag Name ist falsch mit Klassennamen eher als die der Definition von @XmlRootElement. Der Fehler trat auf, als JVM eine Weile lief und nach dem Neustart von JVM verschwand das Problem. – phpinfo

Verwandte Themen