Довольно печать XML с библиотекой Джексона
Я пытаюсь использовать библиотеку Джексона для сериализации объектов Java в XML с помощью аннотаций JAXB. Тем не менее, я сталкиваюсь с проблемой в pretty-печати вывода 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
любой мысли о том, как с этим справиться?
2 ответов
согласно документации Stax2WriterAdapter, реализация по умолчанию является неполной. Также комментарии в коде говорят, что метод writeRaw() не может быть реализован с помощью Stax 1.0, который по умолчанию для Java runtime.
вы должны переключиться на использование библиотеки 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>
его вызвали из-за java.ленг.UnsupportedOperationException:
Если вы реализуете нереализованный метод, ваш код должен работать нормально. для дальнейшего понимания об исключении, пожалуйста, проверьте это
("java.ленг.UnsupportedOperationException: еще не поддерживается.").
спасибо!!