我正在使用eclipselink-2.3.2。我的包被註解:XmlDiscriminatorNode,XmlSchema命名空間和elementFormDefault = QUALIFIED
@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,它就會工作。
我認爲前綴無效,因爲它仍然聲明瞭默認名稱空間,但雖然沒有例外,但該字段仍爲空。
步進EclipseLink代碼後,我看到當QNameInheritancePolicy.classFromRow
調用UnmarshalRecord.get
時,它試圖訪問namespaceURI「http://example.com/namespace」下的屬性「thetype」。
當我將XmlScehma elementFormDefault更改爲UNQUALIFIED時,namespaceURI返回null並且正確檢索屬性。
好極了,它現在可以爲我們工作了。感謝您指出了這一點! – 2012-05-02 12:07:52
一個奇怪的是,之前我們有一個屬性存儲了我們用作@XmlDiscriminatorNode的枚舉的值,並且當屬性和註釋都指定了相同的名稱時,該屬性在XML中出現兩次,導致XML解析器barf 。我希望當類加載到JAXBContext中時我們會得到一個異常。 – 2012-05-02 17:25:51