Я столкнулся с проблемой 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
?
Заранее спасибо!