1

ParentClassを拡張するクラス(ChildClass)があります。アンマーシャリングすると、setPropFromElementList()から、渡した値がリストに存在していても、リストに存在しないという例外が発生します。この問題は、JAXBが子の要素を設定する前に親の属性を設定しようとしたことが原因であると考えています。

親クラスをTransientにしてから、子クラス(親クラスの要素も含む)でpropOrderを使用することを提案するさまざまなブログ投稿や質問を見ました。これは私を助けませんでした-私はIllegalAnnotationExceptionを受け取りました。

何か案は?(サンプルコードは以下のとおりです。これは私が使用した正確なコードではないため、コンパイルされるかどうかは100%わかりません。ただし、実際のコードで行ったことを示しています。)

ParentClass.java

@XmlTransient //on the entire class - not shown here

private String propFromElementList

@XmlAttribute
String getPropFromElementList() {
    return this.propFromElementList;
}

void setPropFromElementList(String value) {
    checkThatValueIsInList(value);
    this.propFromElementList = value;
}

protected abstract void checkThatValueIsInList(String value);

ChildClass.javaはParentClassを拡張します

@XmlType(propOrder = {"list"、 "propFromElementList"})

private String[] list;

@XmlElement
public String[] getList() {
    return this.list;
}

public void setList(final String... list) {
    this.list = list;
}

@Override
protected void checkThatValueIsInList(String value) {
    //search for String and throw RuntimeException if not found
}

XML

<child propFromElementList="A">
    <list>A B C D</list>
</child>
4

1 に答える 1

0

アップデート

継承を使用するときに、属性の前にjaxb要素が設定されていることを確認する方法はありますか?

JAXB(JSR-222)実装がドメインモデルに入力する順序を制御することはできません。JAXB implは、アンマーシャル操作中にXMLドキュメントの深さ優先走査を実行するため、オブジェクトモデルにデータを入力するのが最も好きです。これは、通常、ユースケースで問題を引き起こしていると思われる子要素の前に属性が処理されることを意味します。

検証ロジックをメソッドの外に移動して、setPropFromElementListメソッドに配置することを検討することをお勧めしafterUnmarshalます。


元の回答

propOrder設定は、@XmlTypeマーシャリング時にのみ使用されます。@XmlAttributeでマップされたプロパティをonに含めることはできませpropOrder@XmlType。あなたが持っているので:

@XmlAttribute
String getPropFromElementList() {
    return this.propFromElementList;
}

次に、非属性ノード専用のにpropFromElementList表示することはできません。propOrder

于 2013-03-06T20:04:43.040 に答える