Java 我应该如何配置Jackson以在列表项上使用@XmlRootElement生成XML

Java 我应该如何配置Jackson以在列表项上使用@XmlRootElement生成XML,java,xml,spring-mvc,jackson,jackson-dataformat-xml,Java,Xml,Spring Mvc,Jackson,Jackson Dataformat Xml,我有一个Spring MVC@RestController,它使用通用名称,而不是我用@XmlRootElement或@JacksonXmlRootElement配置的名称。我希望XML看起来像这样: <list> <foo> <name>John</name> </foo> </list> <foo> <name>John</name> </foo>

我有一个
Spring MVC
@RestController
,它使用通用名称,而不是我用
@XmlRootElement
@JacksonXmlRootElement
配置的名称。我希望
XML
看起来像这样:

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

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

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

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

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

    // getters & setters

 }
@XmlRootElement(name=“list”)
@XmlAccessorType(XmlAccessType.FIELD)
公共类ListFoo{
@xmlement(name=“foo”)
私人名单;
//接球手和接球手
}
使用该功能,您可以从
java.util.*
ArrayList
类和其他类定义名称

import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class XmlMapperApp {

    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.addMixIn(ArrayList.class, ArrayListMixIn.class);
        xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);

        List<Item> items = new ArrayList<>();
        items.add(new Item());
        items.add(new Item());
        System.out.println(xmlMapper.writeValueAsString(items));
    }
}

@JacksonXmlRootElement(localName = "list")
interface ArrayListMixIn {
}

class Item {

    private String name = "random - " + ThreadLocalRandom.current().nextDouble();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
import com.fasterxml.jackson.databind.SerializationFeature;
导入com.fasterxml.jackson.dataformat.xml.XmlMapper;
导入com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.ThreadLocalRandom;
公共类XmlMapperApp{
公共静态void main(字符串[]args)引发异常{
XmlMapper XmlMapper=新的XmlMapper();
addMixIn(ArrayList.class,ArrayListMixIn.class);
enable(SerializationFeature.INDENT_输出);
列表项=新建ArrayList();
添加(新项());
添加(新项());
System.out.println(xmlMapper.writeValueAsString(items));
}
}
@JacksonXmlRootElement(localName=“list”)
接口ArrayListMixIn{
}
类项目{
私有字符串name=“random-”+ThreadLocalRandom.current().nextDouble();
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
以上代码打印:

<list>
  <item>
    <name>random - 0.2256442724594785</name>
  </item>
  <item>
    <name>random - 0.9958813192003821</name>
  </item>
</list>

随机-0.2256442724594785
随机-0.9958813192003821

是的,这样可以。然而,在我的spring控制器中,我无法为JSON和XML实现单独的方法,因为我需要为XML创建这个包装类。这是最好的吗?混音也能帮助标记吗?@Timpery,不幸的是,它在课堂上是硬编码的。请看一下StartRotarray的方法。你们当然可以尝试覆盖它,但我看不到实现这一点的简单方法。也许最简单的方法是为列表实现自定义序列化程序,但它看起来也很复杂。@Timpery,另一个问题见示例:有趣的链接。我必须考虑哪一个更易于维护。我倾向于@tcharaf建议的包装纸。谢谢你的深思熟虑!
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class XmlMapperApp {

    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.addMixIn(ArrayList.class, ArrayListMixIn.class);
        xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);

        List<Item> items = new ArrayList<>();
        items.add(new Item());
        items.add(new Item());
        System.out.println(xmlMapper.writeValueAsString(items));
    }
}

@JacksonXmlRootElement(localName = "list")
interface ArrayListMixIn {
}

class Item {

    private String name = "random - " + ThreadLocalRandom.current().nextDouble();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
<list>
  <item>
    <name>random - 0.2256442724594785</name>
  </item>
  <item>
    <name>random - 0.9958813192003821</name>
  </item>
</list>