)
У меня есть xmlelement, который может быть из разных типов. Независимо от типа он имеет одно и то же имя. Это может быть объект или просто ссылка через URI на существующий объект. Я думал, что xmlElements может быть решением. Маршаллинг работает нормально, но при его демаршаллинге он каждый раз выбирает последний заданный тип класса.
Цветок класса, содержащий элемент
@XmlRootElement(name = "Flower")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "id", "name", "refName", "description", "created", "updated", "color",
"seed")
public class Flower extends CommonElements{
private string color;
@XmlElements({
@XmlElement(name="seed", type=Seed.class),
@XmlElement(name="seed", type=Reference.class)
})
public Object seed;
}
Семя класса, которое является одним из типов, которые может содержать элемент
@XmlRootElement(name = "Seed")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "id", "name", "refName", "description", "created", "updated",
"category", "country"})
public class Seed extends CommonElements{
protected String category = "";
protected String country = "";
}
И другой класс, который может содержаться элементом
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Reference {
@XmlAttribute(name="href")
protected URI href;
}
В CommonElements есть только некоторые общие элементы, такие как id, refName, description и т. д. XML может выглядеть так:
<Flower>
<id>http://localhost/test/flowers/1</id>
<refName>redRose</refName>
<description>classical red rose </description>
<color>red</color>
<seed href="http://localhost/test/seeds/1" />
</Flower>
Или как
<Flower>
<id>http://localhost/test/flowers/1</id>
<refName>redRose</refName>
<description>classical red rose </description>
<color>red</color>
<seed>
<id>http://localhost/test/seeds/1</id>
<refName>wildrose</refName>
<description>Special Seed for beautiful wild roses</description>
<category>wildrose</category>
<country>china</country>
</seed>
</Flower>
Я предположил, что разной структуры классов достаточно, чтобы jaxb различал объекты. Я боюсь, что мне придется использовать адаптеры, но я надеюсь, что у кого-то есть еще одна отличная идея.
Я знаю, что есть одна тема, похожая на мою. Но типы в теме выглядят одинаково, поэтому jaxb не может их различить. (JAXB @XmlElements, разные типы, но одно и то же имя?)
Спасибо и извините за мой плохой английский.
Изменить: есть ли способ добавить тип путем сортировки, чтобы jaxb точно знал, какой тип он предназначен для десортировки?