私は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 に戻り、属性が適切に取得されます。