Я использую Spring Boot и хочу преобразовать POJO в XML. Каков самый простой способ сделать это?
Например, у меня есть Person POJO:
public class Person {
private String firstName;
private String lastName;
//getters/setters
}
Как преобразовать List<Person> в это:
<rootElement>
<person>
<firstName>John</firstName>
<lastName>Smith</lastName>
</person>
</rootElement>
И какой класс я должен использовать для его инкапсуляции? Эквивалентом для Джексона является JsonNode из пакета com.fasterxml.jackson.databind. Есть ли какие-либо предварительно настроенные компоненты, которые я могу использовать из Spring Boot?




Вручную
Вы можете использовать упомянутый Библиотека Джексона с форматом данных XML:
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.8'
Сериализация:
Person person = new Person("Ima", "Person")
XmlMapper xmlMapper = new XmlMapper();
String personXml = xmlMapper.writeValueAsString(person);
Десериализация:
XmlMapper xmlMapper = new XmlMapper();
Person person = xmlMapper.readValue(personXml, SimpleBean.class);
Через REST API
Я оставляю этот раздел здесь, так как он может быть полезен другим, кто использует SpringBoot для веб-сервера:
Или, если вы используете стандартный spring-boot-starter-web и хотите обслуживать выходной XML через REST API, Spring автоматически выполнит преобразование за вас. например, возвращаемый тип Person этого метода означает, что Spring автоматически обработает преобразование и транспорт для вывода personService.findById(id)
@GetMapping("/person")
public Person getPerson(@RequestParam("id") String id) {
return personService.findById(id);
}
По умолчанию он будет обслуживать ваши объекты полезной нагрузки в формате JSON, но вы можете изменить его на XML, добавив приведенную выше зависимость для XML-формат данных Джексона.
И дополнительно установка типа Accept в заголовке запроса как Application/XML
Глядя на документ jackson-dataformat-xml, похоже, что это XmlMapper. Я посмотрю, как это сработает.
Да, я только сейчас понял, что оригинальный артефакт jackson-databind сам по себе не будет обрабатывать XML и фактически даже не нужен для этого. Я обновлю свой ответ соответственно
Для прямого преобразования списка в xml, я использую javax.xml.bind.marshaller.
Вы можете аннотировать свой класс pojo, как показано ниже.
@XmlRootElement("Person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
private String firstName;
private String lastName;
//getters/setters
}
И создайте класс List, обернув его.
@XmlRootElement(name = "Persons_List")
public class Persons_List {
List<Person> persons;
// Getters and Setters
}
И вы можете использовать Jaxb в своем методе, как показано ниже.
List<Person> persons = new List<Person>();
// add Person elements to it.
persons.add(person1);
persons.add(person2);
Persons_List persons_list = new Persons_List();
persons_list.setPersons(persons);
JAXBContext context = JAXBContext.newInstance(Persons_List.class, Person.class);
Marshaller jaxbMarshaller = context.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//if you want to output to file.
OutputStream os = new FileOutputStream( "Person.xml" );
jaxbMarshaller.marshal(persons_list, os);
//if you want to display in console.
jaxbMarshaller.marshal(persons_list,new PrintWriter(System.out));
Вывод будет:
<Persons_List>
<Person>
<firstName>John</firstName>
<lastName>Smith</lastName>
</Person>
<Person>
<firstName>Will</firstName>
<lastName>Smith</lastName>
</Person>
</Persons_List>
Мне не нужна конечная точка REST для анализа XML. Я хочу сделать это вручную. Что такое XML-эквивалент ObjectMapper? Я знаю, что Spring будет использовать ObjectMapper за кулисами для разбора JSON, но как насчет XML?