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,它就可以工作。

我假设 unprefixed 会起作用,因为它仍然声明默认命名空间,但是尽管没有例外,但该字段仍然为空。

单步执行 EclipseLink 代码后,我可以看到QNameInheritancePolicy.classFromRow调用时UnmarshalRecord.get,它正在尝试访问 namespaceURI“http://example.com/namespace”下的属性“thetype”。

当我将 XmlScehma elementFormDefault 更改为 UNQUALIFIED 时,namespaceURI 返回 null 并且属性被正确检索。

4

2 回答 2

2

这是EclipseLink JAXB (MOXy)中的一个错误。您可以使用下面的链接跟踪我们在此问题上的进展。我已经有一个附加到错误的修复程序,一旦测试用例完成运行,我将检查它。

更新

此错误现已修复。从 2012 年 4 月 30 日开始,您可以通过获取其中一个 EclipseLink 2.4.0 夜间构建来试用它:

于 2012-04-27T20:40:12.310 回答
1

你的鉴别器是一个属性,所以我认为你只需要添加一个“@”:

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

Blaise Doughan 的这篇博文包含更多信息和示例。

于 2012-04-26T20:30:45.447 回答