使用杰克逊库轻松打印XML

时间:2014-04-09 00:11:00

标签: xml jackson pretty-print

我正在尝试使用Jackson库通过使用JAXB注释将Java对象序列化为XML。但是,我在打印XML输出时遇到了一个问题。

以下是我的示例代码用法:

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

而且,我看到了以下异常。这里的问题是Jackson使用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

关于如何解决它的任何想法?

3 个答案:

答案 0 :(得分:22)

根据Stax2WriterAdapter的文档,他们的默认实现不完整。代码中的注释也表示无法使用Stax 1.0实现writeRaw()方法,而Stax 1.0是Java运行时的缺省值。

您应该按照this wiki page上的建议切换到使用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>

答案 1 :(得分:0)

我已经使用以下依赖项对上述问题进行了排序。以下是这些列表:

1)jackson-annotations-2.9.8.jar

2)jackson-core-2.9.8.jar

3)jackson-databind-2.9.8.jar

4)jackson-dataformat-xml-2.9.8.jar

5)jackson-module-jaxb-annotations-2.9.8.jar

6)stax2-api-4.0.0.jar

7)woodstox-core-asl-4.4.1.jar

enter image description here

@Urosh T:内容已更新。

答案 2 :(得分:-4)

由于 java.lang.UnsupportedOperationException:

而导致

如果您实现未实现的方法,您的代码应该正常工作。有关异常的更多见解,请查看此

"java.lang.UnsupportedOperationException: Not supported yet.")。

谢谢!