Java XmlDiscriminatorNode、XmlSchema命名空间和elementFormDefault=QUALIFIED

Java XmlDiscriminatorNode、XmlSchema命名空间和elementFormDefault=QUALIFIED,java,eclipselink,moxy,Java,Eclipselink,Moxy,我用的是eclipselink-2.3.2。我的包裹附有注释: @XmlSchema(命名空间=”http://example.com/namespace“,elementFormDefault=XmlNsForm.QUALIFIED) 我有以下课程: @XmlRootElement public class Box { private A item; // and getter/setter } @XmlDiscriminatorNode("@thetype") public abs

我用的是eclipselink-2.3.2。我的包裹附有注释:

@XmlSchema(命名空间=”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时:

我得到一个描述性的例外:

org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class indicator field from database row [UnmarshalRecord()]
如果我从包中删除
@XmlSchema
,并从根元素中删除
xmlns
属性,它就会工作。如果我从合格更改为不合格,只要我向它提供难看的前缀XML,它就可以工作

我假设unfixed可以工作,因为它仍然声明默认名称空间,但是尽管没有异常,字段仍然为null

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


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

您的鉴别器是一个属性,因此我认为您只需要添加一个“@”:

这包含了更多信息和一个示例。

这是中的一个错误。您可以使用下面的链接跟踪我们在这个问题上的进展。我已经有了一个附加到bug的修复程序,一旦测试用例运行完毕,我就会检查它

更新

此错误现已修复。从2012年4月30日开始,您可以通过获取EclipseLink 2.4.0夜间版本之一来尝试:


对不起;这是我的错,我提出了一个人为的例子。我已经编辑了这个问题。(事实上,那篇博客文章正是我复制的案例,只是我在添加XmlSchema时开始遇到问题)太好了,它现在对我们有用了。谢谢你指出这一点!一件奇怪的事情是,之前我们有一个属性存储我们用作@XmlDiscriminatorNode的枚举值,当属性和注释都指定相同的名称时,该属性在XML中出现两次,导致XML解析器呕吐。我希望在类加载到JAXBContext中时会出现异常。
@XmlDiscriminatorNode("@thetype")
public abstract class A {}