2014-04-09 9 views
13

Ich versuche, Jackson-Bibliothek verwenden, um Java-Objekte in XML mithilfe von JAXB-Anmerkungen zu serialisieren. Allerdings habe ich ein Problem beim Drucken der XML-Ausgabe.Hübsches Drucken von XML mit Jackson-Bibliothek

Hier ist mein Beispielcode Nutzung:

ObjectMapper mapper = new XmlMapper(); 
mapper.enable(SerializationFeature.INDENT_OUTPUT); 
String xml = mapper.writeValueAsString(person); 

Und, ich bin die unten Ausnahme zu sehen. Das Problem hier ist Jackson verwendet Stax2Writer als XML-Writer und Stax2 scheint nicht das Schreiben von rohen Zeichenfolgen zu unterstützen (in diesem Fall versucht DefaultPrettyPrinter, "\ n" als rohe Zeichenfolge zu schreiben).

com.fasterxml.jackson.databind.JsonMappingException: Not implemented (through reference chain: xml.serialization.jackson.dto.Person["name"]) 
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232) 
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197) 
    at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:187) 
    at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializer.serializeFields(XmlBeanSerializer.java:174) 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152) 
    at com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider.serializeValue(XmlSerializerProvider.java:92) 
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2818) 
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2275) 
    at xml.serialization.jackson.SerializationTest.main(SerializationTest.java:46) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: java.lang.UnsupportedOperationException: Not implemented 
    at org.codehaus.stax2.ri.Stax2WriterAdapter.writeRaw(Stax2WriterAdapter.java:380) 
    at org.codehaus.stax2.ri.Stax2WriterAdapter.writeRaw(Stax2WriterAdapter.java:373) 
    at com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter$Lf2SpacesIndenter.writeIndentation(DefaultXmlPrettyPrinter.java:498) 
    at com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter.writeLeafElement(DefaultXmlPrettyPrinter.java:271) 
    at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.writeString(ToXmlGenerator.java:489) 
    at com.fasterxml.jackson.databind.ser.std.StringSerializer.serialize(StringSerializer.java:39) 
    at com.fasterxml.jackson.databind.ser.std.StringSerializer.serialize(StringSerializer.java:21) 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541) 
    at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializer.serializeFields(XmlBeanSerializer.java:161) 
    ... 10 more 

Irgendwelche Gedanken, wie man es bearbeitet?

Antwort

17

Gemäß der Dokumentation von Stax2WriterAdapter ist die Standardimplementierung unvollständig. Auch Kommentare im Code sagen, dass die Methode writeRaw() nicht mit Stax 1.0 implementiert werden kann, das standardmäßig für die Java-Laufzeit verwendet wird.

Sie sollten zur Verwendung einer Stax2-Bibliothek wie unter this wiki page vorgeschlagen wechseln.

Nachdem ich die folgende Maven Abhängigkeit zu meinem Projekt hinzugefügt, begann das folgende Beispiel wie erwartet zu funktionieren:

<dependency> 
     <groupId>org.codehaus.woodstox</groupId> 
     <artifactId>woodstox-core-asl</artifactId> 
     <version>4.1.4</version> 
    </dependency> 

Beispiel-Code:

public class JacksonXmlMapper { 

    public static class Person { 
     final public String name; 

     public Person(String name) { 
      this.name = name; 
     } 
    } 
    public static void main(String[] args) throws JsonProcessingException { 
     ObjectMapper mapper = new XmlMapper(); 
     mapper.enable(SerializationFeature.INDENT_OUTPUT); 
     System.out.println(mapper.writeValueAsString(new Person("John"))); 
    } 
} 

Ausgang:

<Person> 
    <name>John</name> 
</Person> 
-4

Sein verursacht wegen der java.lang.UnsupportedOperationException:

, wenn Sie die nicht implementierte Methode implementieren, sollten Sie den Code in Ordnung arbeiten werden. für weitere einblicke über die ausnahme, überprüfen sie bitte diese

("java.lang.UnsupportedOperationException: Not supported yet.").

Danke !!

+0

I Ich habe bereits erwähnt, dass Stax2Writer anscheinend keine Rohzeichen wie "\ n" unterstützt. Meine Frage ist mehr über das Drucken von XML mit jackson, da sie dokumentieren, dass es unterstützt wird. – Buchi