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

спасибо!!