XmlDiscriminatorNode,XmlSchema名称空间和elementFormDefault = QUALIFIED

时间:2012-04-26 19:17:30

标签: java eclipselink moxy

我正在使用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并正确检索该属性。

2 个答案:

答案 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包含更多信息和示例。