Довольно печатать XML с библиотекой Джексона
Я пытаюсь использовать библиотеку Джексона для сериализации объектов Java в XML с помощью аннотаций JAXB. Тем не менее, я сталкиваюсь с проблемой в довольно печатной версии 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
Любые мысли о том, как работать с ним?
Ответы
Ответ 1
Согласно документации Stax2WriterAdapter их реализация по умолчанию является неполной. Также комментарии в коде говорят о том, что метод writeRaw() не может быть реализован с использованием Stax 1.0, который является по умолчанию для среды выполнения Java.
Вы должны перейти на использование библиотеки 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>
Ответ 2
Я использовал приведенные ниже зависимости для сортировки вышеупомянутой проблемы. Вот список тех:
1) Джексон-аннотации-2.9.8.jar
2) Джексон-ядро-2.9.8.jar
3) Джексон-databind-2.9.8.jar
4) jackson-dataformat-xml-2.9.8.jar
5) Джексон-модуль-jaxb-annotations-2.9.8.jar
6) stax2-api-4.0.0.jar
7) woodstox-core-asl-4.4.1.jar
введите описание изображения здесь
@Urosh T: контент обновлен.
Ответ 3
Он вызван из-за java.lang.UnsupportedOperationException:
если вы реализуете нереализованный метод, ваш код должен работать нормально. для получения дополнительной информации об исключении, пожалуйста, проверьте это
( "java.lang.UnsupportedOperationException: еще не поддерживается." ).
Спасибо!!