2014-04-09 58 views
13

我想用Jackson庫通過JAXB批註將Java對象序列化爲XML。不過,我在打印XML輸出時遇到了一個問題。用Jackson庫漂亮打印XML

這裏是我的示例代碼的使用:

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

而且,我看到下面的例外。這裏的問題是傑克遜使用Stax2Writer作爲XML編寫器,而Stax2似乎不支持編寫原始字符串(在這種情況下,DefaultPrettyPrinter會嘗試將原始字符串編寫爲「\ n」)。

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 

有關如何處理它的任何想法?

回答

17

根據Stax2WriterAdapter的文檔,它的默認實現是不完整的。代碼中的註釋還說,writeRaw()方法不能使用Stax 1.0(它是Java運行時的默認值)來實現。

您應該按照this wiki page上的建議切換到使用Stax2庫。

後我加入以下Maven依賴於我的項目,下面的例子就開始按預期工作:

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

代碼示例:

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

輸出:

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

其造成的,因爲java.lang.UnsupportedOperationException的:

如果實現了未實現的方法,你的代碼應該是工作的罰款。有關例外情況的進一步見解,請檢查此

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

謝謝!

+0

我已經提到Stax2Writer似乎不支持寫入「\ n」這樣的原始字符。我的問題是關於如何用jackson漂亮地打印XML,因爲他們記錄了它的支持。 – Buchi