2

)

さまざまなタイプの xmlelement があります。タイプに関係なく、同じ名前です。これは、オブジェクト、または既存のオブジェクトへの URI を介した単なる参照にすることができます。xmlElements が解決策になると思いました。マーシャリングは正常に機能しますが、アンマーシャリングすると、最後に指定されたクラス タイプが毎回選択されます。

要素を含むクラス Flower

@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;

}

要素が含むことができるタイプの 1 つであるクラス シード

@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 がオブジェクトを区別するには、クラスの構造が異なるだけで十分だと思いました。残念ながらアダプターを使用する必要がありますが、誰かが別の素晴らしいアイデアを持っていることを願っています.

私に似たトピックが 1 つあります。しかし、トピック内のタイプは似ているため、jaxb はそれらを区別できません。( JAXB @XmlElements、タイプは違うが名前は同じ? )

私の悪い英語に感謝し、申し訳ありません。

編集:マーシャリングによってタイプを追加する方法はありますか?jaxbは、アンマーシャリングのタイプを正確に認識していますか?

4

1 に答える 1