2014-04-09 13 views
13

Próbuję użyć biblioteki Jackson do serializacji obiektów Java w XML przy użyciu adnotacji JAXB. Jednak mam problem z ładnym drukowaniem danych wyjściowych XML.Dosyć drukowanie XML z biblioteką Jacksona

Oto moja próba użycia kodu:

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

I widzę poniższy wyjątek. Problem w tym, że Jackson używa Stax2Writer jako program piszący XML i Stax2 wydaje się nie obsługiwać pisania nieprzetworzonych łańcuchów (w tym przypadku DefaultPrettyPrinter próbuje napisać "\ n" jako surowy ciąg).

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 

Jakieś przemyślenia na temat tego, jak sobie z tym poradzić?

Odpowiedz

17

Zgodnie z dokumentacją Stax2WriterAdapter domyślna implementacja jest niekompletna. Również komentarze w kodzie mówią, że metoda writeRaw() nie może być zaimplementowana przy użyciu Stax 1.0, który jest domyślny dla środowiska wykonawczego Java.

Należy przełączyć na bibliotekę Stax2 zgodnie z sugestią podaną na this wiki page.

Po dodałem następujące zależności Maven do mojego projektu, przykład poniżej zaczęły działać zgodnie z oczekiwaniami:

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

Kod:

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

wyjściowa:

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

Jego spowodowane powodu java.lang.UnsupportedOperationException:

jeśli wdrożenie metody ZAIMPLEMENTOWANE, kod powinien być dobrze działa. Aby uzyskać więcej informacji na temat wyjątku, sprawdź ten

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

Dzięki!

+0

I już wspomniałem, że Stax2Writer wydaje się nie obsługiwać pisania surowych znaków takich jak "\ n". Moje pytanie dotyczy raczej ładnego drukowania XML z jacksonem, ponieważ dokumentują one, że jest on obsługiwany. – Buchi

Powiązane problemy