Довольно печатать 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: еще не поддерживается." ).

Спасибо!!