Возможно ли, чтобы Jackson ObjectMapper выполнял XML-аннотации JAXB в приложении Spring Boot? - PullRequest
0 голосов
/ 30 августа 2018

Имея приложение , использующее ObjectMapper Я использую следующий шаблон для аккуратно сериализованного поля List:

@JacksonXmlProperty(localName = "item")
@JacksonXmlElementWrapper(useWrapping = true, localName = "items")    
private List<Item> items;

чтобы получить что-то вроде:

<items>
   <item>...</item>
   <item>...</item>
   ...
</items>

Я изучил - без всякой удачи - как можно было бы использовать аннотации типа @XmlElementWrapper для достижения этой цели.

Есть ли - например - что-то, что я могу сделать с JacksonConfiguration?

UPDATE

Добавление

objectMapper.registerModule(new JaxbAnnotationModule());

для Spring Jackson Конфигурация и аннотирование типа:

@XmlElementWrapper
@XmlElement(name="item")
private List<Item> items;

не работает должным образом. В настоящее время я изучаю возможность замены Джексона на GSON, как это сделано в этой записи

Мне бы очень хотелось, чтобы эти аннотации были общими, а не только специфичными или как добавление аннотаций для реализации сериализатора.

1 Ответ

0 голосов
/ 30 августа 2018

Я не пробовал 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).

Возможно, в более поздних версиях вы получите более качественный вывод.

...