2014-04-09 16 views
13

Tôi đang cố gắng sử dụng thư viện Jackson để tuần tự hóa các đối tượng Java vào XML bằng cách sử dụng chú thích JAXB. Tuy nhiên, tôi phải đối mặt với một vấn đề trong việc in ấn đầu ra XML.In XML đẹp với thư viện Jackson

Đây là mẫu mã sử dụng của tôi:

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

Và, tôi nhìn thấy ngoại trừ bên dưới. Vấn đề ở đây là Jackson sử dụng Stax2Writer như XML writer và Stax2 dường như không hỗ trợ viết các chuỗi thô (trong trường hợp này DefaultPrettyPrinter cố gắng viết "\ n" làm chuỗi thô).

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 

Bất kỳ suy nghĩ nào về cách giải quyết?

Trả lời

17

Theo tài liệu của Stax2WriterAdapter, việc triển khai mặc định của họ không hoàn chỉnh. Ngoài ra các chú thích trong đoạn mã nói rằng phương thức writeRaw() không thể được thực hiện bằng cách sử dụng Stax 1.0 là mặc định cho thời gian chạy Java.

Bạn nên chuyển sang sử dụng thư viện Stax2 như được đề xuất trên this wiki page.

Sau khi tôi thêm sự phụ thuộc Maven sau đây để dự án của tôi, ví dụ dưới đây bắt đầu làm việc như mong đợi:

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

Mã dụ:

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

Output:

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

của nó gây ra do sự java.lang.UnsupportedOperationException:

nếu bạn thực hiện phương pháp chưa thực hiện, mã của bạn sẽ hoạt động tốt. để có thông tin chi tiết hơn về ngoại lệ, vui lòng kiểm tra điều này

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

Cảm ơn !!

+0

tôi đã đề cập rằng Stax2Writer dường như không hỗ trợ viết các ký tự thô như "\ n". Câu hỏi của tôi là nhiều hơn về cách in đẹp XML với jackson vì chúng ghi lại rằng nó được hỗ trợ. – Buchi

Các vấn đề liên quan