3

このようなことを達成したいと思います。

<zoo>
    <lion> ... </lion>
    <dog> ... </dog>
</zoo> 

ここにこのクラスがあります。

public class MainGroup {
    private List<Widget> widgets;

    @XmlAnyElement
    public List<Widget> getWidgets() {
        return widgets;
    }
    public void setWidgets(List<Widget> widgets) {
        this.widgets = widgets;
    }
}

そして、この Widget スーパークラスには、Button、Combobox などのサブクラスがあります...このようなことを実現したいと思います。

<MainGroup>
    <Button>...</Button>
    <Combo>...</Combo>
</MainGroup>

私はこの例外を抱えています

[com.sun.istack.internal.SAXException2: class com.test.Button nor any of its super
  class is known to this context.

@XmlElementRef を追加しようとしましたが、まだ機能していません。

@XmlElementRefs({
     @XmlElementRef(name="Button", type=Button.class),
     @XmlElementRef(name="Combo", type=Combo.class)
})
4

2 に答える 2

1

ユースケースのマッピング

私の答えは、関連する質問の 1 つから収集された情報に基づいています。

ソースを持たない (したがって JAXB アノテーションを追加できない) クラスをマッピングしているので、@XmlElementsマッピングを使用することをお勧めします。

@XmlElements({
     @XmlElement(name="Button", type=Button.class),
     @XmlElement(name="Combo", type=Combo.class)
})
public List<Widget> getWidgets() {
    return widgets;
}

@XmlElementsの XML スキーマの概念に対応しますxsd:choice

@XmlRootElement

わかりました、私はここでかなり多くのものを見逃しています。それを実現するために、この @XmlRootElement アノテーションを Button と Combo のサブクラスに追加するようです。

サブクラスでその注釈が必要な理由を誰かに説明してもらえますか...混乱しています。XMLには@XmlRootElementしかなく、私の場合はMainGroupクラスにあるはずだと思いました。

@XmlRootElementXML スキーマのグローバル要素に対応します。これには、非整列化するドキュメントのルート要素だけではありません。以下のいくつかの役割について説明します。

@XmlElementRef

@XmlElementRef置換基の概念に対応します。XML スキーマでは、1 つのグローバル要素が別の要素に置き換え可能であることを指定できます。JAXB では@XmlRootElement(および@XmlElementDecl) を利用してグローバル要素を指定します。

@XmlAnyElement

@XmlAnyElementXML スキーマの xs:any の概念に対応します。これはかなり自由な形式のドキュメントの一部です。JAXB では、プロパティをマップすると、宣言に@XmlAnyElement(lax=true)一致する要素が対応するドメイン オブジェクトに変換されます。@XmlRootElement

于 2012-07-26T14:56:26.597 に答える
0

わかりました、私はここでかなり多くのものを見逃しています。@XmlRootElementそれを達成するために、この注釈をボタンとコンボのサブクラスに追加するようです。

サブクラスでその注釈が必要な理由を誰かに説明してもらえますか...混乱しています。XMLには@XmlRootElement、私の場合はMainGroupクラスにあるはずの のみがあると思いました。

于 2012-07-26T03:18:20.810 に答える