我正在使用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,它就可以工作。
我假设 unprefixed 会起作用,因为它仍然声明默认命名空间,但是尽管没有例外,但该字段仍然为空。
单步执行 EclipseLink 代码后,我可以看到QNameInheritancePolicy.classFromRow
调用时UnmarshalRecord.get
,它正在尝试访问 namespaceURI“http://example.com/namespace”下的属性“thetype”。
当我将 XmlScehma elementFormDefault 更改为 UNQUALIFIED 时,namespaceURI 返回 null 并且属性被正确检索。