首页 > 解决方案 > 我应该如何配置 Jackson 以在列表项上使用 @XmlRootElement 生成 XML

问题描述

我有一个Spring-MVC @RestController使用通用名称而不是我用@XmlRootElementor配置的名称@JacksonXmlRootElement。我想XML看起来像这样:

<list>
  <foo>
    <name>John</name>
  </foo>
</list>

但我得到以下信息:

<ArrayList>
  <item>
    <name>John</name>
  </item>
</ArrayList>

正确编组单个实例如下所示:

<foo>
  <name>John</name>
</foo>

为了尝试解决这个问题,我尝试同时使用JacksonJAXB注释。我还在 Stack Overflow、各种博客以及针对JacksonSpring-mvc.

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import org.junit.Test;    
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;

public class JacksonXmlTest {

    @XmlRootElement(name="foo")
    @XmlAccessorType(XmlAccessType.FIELD)
    public static class Foo {
        private String name;

        public Foo(String name) {
            setName(name);
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    @Test
    public void understandListTest() throws JsonProcessingException {
        // This is a JUnit test.....
        List<Foo> fooList = new ArrayList<>();
        fooList.add(new Foo("John"));

        XmlMapper mapper = new XmlMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(new JaxbAnnotationModule());
        System.err.println(mapper.writeValueAsString(fooList));
        System.err.println();
        System.err.println(mapper.writeValueAsString(fooList.get(0)));
    }

}

请帮我配置 jackson 以输出包含在“list”标签中的列表,并将每个 Foo 对象包含在“foo”标签中,而不是“item”标签中。

标签: javaxmlspring-mvcjacksonjackson-dataformat-xml

解决方案


您应该创建一个包含 Foo 对象列表的 ListFoo 类:

@XmlRootElement(name="list")
@XmlAccessorType(XmlAccessType.FIELD)
public class ListFoo {

    @XmlElement(name = "foo")
    private List<Foo> listFoo;

    // getters & setters

 }

推荐阅读