Элементы XML-списка Джексона соответствуют их корневому имени

Используя XmlMapper Джексона, есть ли способ, чтобы имена элементов списка объектов совпадали с localName, указанным в @JacksonXmlRootElement?

Например, для следующих классов

interface Foo {}

@JacksonXmlRootElement(localName = "bar")
class Bar implements Foo {}

@JacksonXmlRootElement(localName = "baz")
class Baz implements Foo {}

@JacksonXmlRootElement(localName = "container")
class FooContainer {
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Foo> foos;

    FooContainer(List<Foo> foos) {
        this.foos = foos;
    }

    public List<Foo> getFoos() {
        return foos;
    }
}

Использование XmlMapper

FooContainer container = new FooContainer(Arrays.asList(new Bar(), new Baz()));
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.writeValueAsString(container);

Получаем следующий XML

<container>
  <foos/>
  <foos/>
</container>

Есть ли способ вместо этого получить это?

<container>
  <bar/>
  <baz/>
</container>

person Dillon Ryan Redding    schedule 16.03.2018    source источник


Ответы (1)


Я не смог найти способ сделать это в Джексоне, но в JAXB это почти тривиально.

interface Foo {}

class Bar implements Foo {}

class Baz implements Foo {}

@XmlRootElement(name = "container")
@XmlAccessorType(XmlAccessType.FIELD)
class FooContainer {
    @XmlElements({
        @XmlElement(name = "bar", type = Bar.class),
        @XmlElement(name = "baz", type = Baz.class)
    })
    private List<Foo> foos;

    FooContainer() {}

    FooContainer(List<Foo> foos) {
        this.foos = foos;
    }

    public List<Foo> getFoos() {
        return foos;
    }
}

Демаршаллинг:

FooContainer container = new FooContainer(Arrays.asList(new Bar(), new Baz()));

JAXBContext jaxbContext = JAXBContext.newInstance(FooContainer.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.marshal(container, System.out);
person Dillon Ryan Redding    schedule 21.03.2018