xmlElements с одинаковым именем и разными типами

)

У меня есть 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 точно знал, какой тип он предназначен для десортировки?


person nsrlady    schedule 29.04.2013    source источник


Ответы (1)


Вы не можете иметь одно и то же имя внутри @XmlElements. Код не будет компилироваться. Вы можете использовать @XmlSeeAlso, но это неправильный способ сделать это. @XmlSeeAlso предназначен для подклассов, но в этом случае он будет работать.

Это решение будет работать только в том случае, если вы знаете тип классов, установленных в

цветок.объект

@XmlRootElement(name = "Flower")
@XmlSeeAlso({Seed.class,Reference.class})
@XmlAccessorType(XmlAccessType.FIELD)
public class Flower extends CommonElements {
    public Flower(){}

    public Flower(String id, String name){
        super(id,name);
    }
    @XmlAttribute
    private String color;
    @XmlElement
    public Object seed;

    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
}

<Flower>
    <id>2</id>
    <refName>redRose</refName>
    <color>RED</color>
    <seed xsi:type="seed" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <id>1</id>
        <refName>wildrose</refName>
        <category></category>
        <country>USA</country>
    </seed>
</Flower>

<Flower>
    <id>3</id>
    <refName>whiteRose</refName>
    <color>white</color>
    <seed xsi:type="reference" href="www.google.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</Flower>
person Chandru    schedule 29.04.2013
comment
ммм... одно и то же имя скомпилировано и отсортировано идеально. Но ваше решение работает нормально. Как вы сказали, xmlsee также предназначен для чего-то другого ... поэтому он кажется немного грязным ... но пока он работает, меня это устраивает. :) - person nsrlady; 29.04.2013
comment
странный. для меня в eclipse juno с JDK6 это дает ошибку компиляции. - person Chandru; 07.05.2013
comment
хм... теперь я получаю [com.sun.istack.internal.SAXException2: экземпляр Seed заменяет java.lang.Object, но Seed привязан к анонимному типу.] - person nsrlady; 14.05.2013
comment
Я получил ошибку, потому что у меня был в моем Seed.class @XmlType(name=).. теперь ошибка имеет смысл;) - person nsrlady; 14.05.2013