3

私はeclipselink-2.3.2を使用しています。私のパッケージには注釈が付けられています:

@XmlSchema(namespace = "http://example.com/namespace", elementFormDefault = XmlNsForm.QUALIFIED)

私は次のクラスを持っています:

@XmlRootElement
public class Box {
    private A item; // and getter/setter
}

@XmlDiscriminatorNode("@thetype")
public abstract class A {}

@XmlDiscriminatorValue("b")
public class B extends A {}

@XmlDiscriminatorValue("c")
public class C extends A {}

次のように有効な XML を逆シリアル化しようとすると、次のようになります。

<box xmlns="http://example.com/namespace"><a thetype="b" /></box>

説明的な例外が発生します。

org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class indicator field from database row [UnmarshalRecord()]

@XmlSchemaパッケージからを削除しxmlns、ルート要素から属性を削除すると、機能します。QUALIFIED から UNQUALIFIED に​​変更すると、醜いプレフィックス付きの XML をフィードする限り機能します。

デフォルトの名前空間を宣言しているため、接頭辞なしでも機能すると思いましたが、例外はありませんが、フィールドは null のままです。

EclipseLink コードをステップ実行すると、QNameInheritancePolicy.classFromRowが呼び出されたときUnmarshalRecord.getに、名前空間 URI "http://example.com/namespace" の下の属性 "thetype" にアクセスしようとしていることがわかります。

XmlSchema elementFormDefault を UNQUALIFIED に​​変更すると、namespaceURI が null に戻り、属性が適切に取得されます。

4

2 に答える 2

2

これは、EclipseLink JAXB (MOXy)のバグです。以下のリンクを使用して、この問題の進行状況を追跡できます。バグにはすでに修正が添付されています。テスト ケースの実行が完了したら、チェックインします。

アップデート

このバグは修正されました。2012 年 4 月 30 日以降、EclipseLink 2.4.0 ナイトリー ビルドの 1 つを入手して試すことができます。

于 2012-04-27T20:40:12.310 に答える
1

識別子は属性なので、「@」を追加するだけでよいと思います。

@XmlDiscriminatorNode("@thetype")
public abstract class A {}

Blaise Doughanによるこのブログ投稿には、いくつかの詳細情報と例が含まれています。

于 2012-04-26T20:30:45.447 に答える