XmlMapper с тем же @XmlElement, но другим @XmlElementWrapper - PullRequest
0 голосов
/ 13 марта 2020

У меня есть класс, в котором есть несколько списков строк, которые я хочу собрать через Джексона. И для лучшего использования я хочу иметь в каждом списке одно и то же имя элемента. Поэтому я комментирую так:

import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;

public class MyClass
{
    public String title;

    @XmlElementWrapper(name="hints")
    @XmlElement(name="text")
    public List<String> hints;

    @XmlElementWrapper(name="warnings")
    @XmlElement(name="text")
    public List<String> warnings;

    @XmlElementWrapper(name="errors")
    @XmlElement(name="text")
    public List<String> errors;
}

Но во время выполнения я получаю исключение Невозможно записать JSON: несколько полей, представляющих свойство "text" . Я также попробовал это без эффекта:

// mapper instanceof com.fasterxml.jackson.dataformat.xml.XmlMapper
mapper.configure(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME, true);

Что мне нужно дополнительно?

1 Ответ

0 голосов
/ 06 апреля 2020

Не идеальное решение, но все же хороший обходной путь, когда я разделяю сам список в новом классе и удаляю перенос (поскольку он переносится членами, использующими этот новый тип):

public class StringList
{
    @JacksonXmlElementWrapper(useWrapping = false)
    @XmlElement(name="text")
    public final List<String> list = new ArrayList<String>();

    public void add( String msg )
    {
        list.add( msg );
    }
}

. .. так мой класс будет выглядеть так:

public class MyClass
{
    public String title;

    public StringList hints;

    public StringList warnings;

    public StringList errors;
}
...