2014-04-09 42 views
13

JAXB ek açıklamalarını kullanarak Java nesnelerini XML'ye serileştirmek için Jackson kütüphanesini kullanmaya çalışıyorum. Ancak, XML çıktısını güzel yazdırırken bir sorunla karşılaşıyorum. Ben aşağıda istisna görüyorum,Güzel Jackson kütüphanesiyle XML yazdırma

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

Ve:

İşte benim örnek kod kullanımıdır. Buradaki sorun, Jackson'ın XML yazıcısı olarak Stax2Writer'i kullanması ve Stax2'nin ham dizeleri yazmayı desteklemediği görülüyor (bu durumda DefaultPrettyPrinter, ham dizgisi olarak "\ n" yazmayı deniyor).

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 

Etrafında nasıl çalışılacağı hakkında bir fikrin var mı?

cevap

17

Stax2WriterAdapter belgelerine göre varsayılan uygulama eksik. Ayrıca, koddaki yorumlar, writeRaw() yönteminin, Java çalışma zamanı için varsayılan olan Stax 1.0 kullanılarak uygulanamadığını söylemektedir.

this wiki page üzerinde önerildiği gibi bir Stax2 kitaplığı kullanmak için geçiş yapmalısınız.

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

Kod örneği:

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

Çıktı:

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

Onun yüzünden java.lang.UnsupportedOperationException arasında neden oldu: Eğer uygulanmamış bir yöntem uygulamak durumunda, kod iyi çalışıyor olmalıdır

. İstisna ile ilgili ayrıntılı bilgiler için lütfen bu

("java.lang.UnsupportedOperationException: Not supported yet.") 'a bakın.

Teşekkürler!

+0

I beklendiği gibi

Projemde için aşağıdaki Maven bağımlılık eklendi sonra Aşağıdaki örnek çalışmaya başladı Stax2Writer'in "\ n" gibi ham karakterleri yazmayı desteklemediğini daha önce belirtmiştim. Sorumluluk, desteklendiğini belgelediklerinden, Jackson ile nasıl güzel bir şekilde yazdırılabileceğiyle ilgili daha fazla soru. – Buchi