Я не пробовал jackson-dataformat-xml / JaxbAnnotationModule и я не уверен, что он совместим с spring-boot (вы должны написать обратно, если он есть), но его стоит протестировать это.
Обновление
Вот вам тест (по ссылке выше)
import java.io.IOException;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
public class TestJacksonWithJaxbAnnot {
static ObjectMapper objectMapper = new ObjectMapper();
static {
objectMapper.registerModule(new JaxbAnnotationModule());
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "item")
static class Item {
@XmlElement
int id;
@XmlElement
String name;
//getters, setters, etc.
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "itemcollection")
static class ItemCollection {
@XmlElement
String nameOfItems;
@XmlElement
List<Item> items;
//getters, setters, etc.
}
public static void main(String[] args) throws XMLStreamException, IOException {
ItemCollection testColl = new ItemCollection();
testColl.nameOfItems = "Test items";
Item item1 = new Item();
item1.id = 1;
item1.name = "apple";
Item item2 = new Item();
item2.id = 2;
item2.name = "orange";
testColl.items = Arrays.asList(item1, item2);
StringWriter stringWriter = new StringWriter();
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter sw = xmlOutputFactory.createXMLStreamWriter(stringWriter);
XmlMapper mapper = new XmlMapper();
sw.writeStartDocument();
sw.writeStartElement("root");
mapper.writeValue(sw, testColl);
sw.writeComment("Some insightful commentary here");
sw.writeEndElement();
sw.writeEndDocument();
System.out.println(stringWriter.toString());
}
}
Выход:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<ItemCollection>
<nameOfItems>Test items</nameOfItems>
<items>
<items>
<id>1</id>
<name>apple</name>
</items>
<items>
<id>2</id>
<name>orange</name>
</items>
</items>
</ItemCollection>
<!--Some insightful commentary here-->
</root>
Как видите, оно не идеально, например, он не обрабатывал определенные имена в аннотациях @XmlRootElement. (Протестировано в моем проекте весенней загрузки 1.5.10.RELEASE, где jackson-dataformat-xml имеет управляемую версию 2.8.10).
Возможно, в более поздних версиях вы получите более качественный вывод.