JAXB unmarshal: значение атрибута через запятую и XmlIDREF - PullRequest
0 голосов
/ 11 марта 2020

Я столкнулся с проблемой XmlAdapter и @XmlIDREF. Это выполнимо другим способом, но я бы хотел найти решение с @XmlIDREF и @XmlID. Короче говоря, у меня есть атрибут, который разделен запятыми, несколько значений, которые являются идентификаторами других элементов. Поэтому мне нужно распаковать файл xml.

XML

У меня есть похожая структура файла xml, которую я не могу изменить.

<rootelement>
  <uniqitems>
    <uniqitem id="123"/>
    <uniqitem id="321"/>
  </uniqitems>
  <events>
    <event itemids="123"/>
    <event itemids="123,321"/>
  </events>
</rootelement>

RootElement. java

@XmlRootElement(name = "rootelement")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class RootElement{

    private List<UniqItem> uniqItems;
    private List<Event> events;

    @XmlElementWrapper(name = "uniqitems")
    @XmlElement(name = "uniqitem")
    public List<UniqItem> getUniqItems() {
        return uniqItems;
    }

    public void setUniqItems(List<UniqItem> uniqItems) {
        this.uniqItems= uniqItems;
    }

    @XmlElementWrapper(name = "events")
    @XmlElement(name = "event")
    public List<Event> getEvents() {
        return events;
    }

    public void setEvents(List<Event> events) {
        this.events= events;
    }
}

UniqItem. java

@XmlRootElement(name = "uniqitem")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class UniqItem {

    private String id;

    @XmlAttribute(name = "id")
    @XmlID
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

Событие. java

@XmlRootElement(name = "event")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Event {

    private List<UniqItem> uniqItems;

    @XmlAttribute(name = "itemids")
    @XmlJavaTypeAdapter(value = CommaSeparatedListXmlAdapter.class)
    @XmlIDREF
    public List<UniqItem> getUniqItems() {
        return uniqItems;
    }

    public void setUniqItems(List<UniqItem> uniqItems) {
        this.uniqItems= uniqItems;
    }
}

Как видите, event имеет атрибут itemids, который может содержать несколько значений. Поскольку они не разделены пробелом, невозможно использовать @XmlList. В этом случае я использую CommaSeparatedListXmlAdapter (аналогично этому ответу { ссылка }).

И здесь у меня проблема, что он изменит тип на List<String>. @XmlIDREF видит, что String не имеет @XmlID, а также выбрасывает и выдает ошибку: XmlIDREF property is referencing a type "java.lang.String" that doesn't have an XmlID property

Это логично, но я ожидал, что XmlAdapter сделает List<String>, что будет повторяться и для каждого id он найдет ссылку и изменит ее на List<UniqItem>.

Я могу найти ссылки вручную, сопоставив rootelement 'uniqitems в моем коде спагетти , но нет ли решения с @XmlID и @XmlIDREF?

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...