我正在使用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,它就会起作用。
我认为没有前缀会起作用,因为它仍然声明了默认命名空间,但是没有例外,该字段仍为空。
在单步执行EclipseLink代码后,我可以看到当QNameInheritancePolicy.classFromRow
调用UnmarshalRecord.get
时,它会尝试访问namespaceURI“http://example.com/namespace下的属性”thetype“ ”
当我将XmlScehma elementFormDefault更改为UNQUALIFIED时,namespaceURI返回null并正确检索该属性。
答案 0 :(得分:2)
这是EclipseLink JAXB (MOXy)中的错误。您可以使用以下链接跟踪我们在此问题上的进展。我已经有了一个修复程序,我会在测试用例运行完毕后检查它。
<强>更新强>
此错误现已修复。您可以通过从2012年4月30日开始获取EclipseLink 2.4.0之一的每个版本来试用它:
答案 1 :(得分:1)
你的鉴别器是一个属性,所以我认为你只需要添加一个“@”:
@XmlDiscriminatorNode("@thetype")
public abstract class A {}
此blog post by Blaise Doughan包含更多信息和示例。