【问题标题】:XmlDiscriminatorNode, XmlSchema namespace, and elementFormDefault=QUALIFIEDXmlDiscriminatorNode、XmlSchema 命名空间和 elementFormDefault=QUALIFIED
【发布时间】:2012-04-26 19:17:29
【问题描述】:

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

【问题讨论】:

    标签: java eclipselink moxy


    【解决方案1】:

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

    更新

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

    【讨论】:

    • 太好了,它现在对我们有用。感谢您指出这一点!
    • 一个奇怪的事情是,早些时候我们有一个属性存储我们用作 @XmlDiscriminatorNode 的枚举值,当属性和注释指定相同的名称时,该属性在XML,导致 XML 解析器出错。我希望当类加载到 JAXBContext 时我们会得到一个异常。
    【解决方案2】:

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

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

    blog post by Blaise Doughan 包含更多信息和示例。

    【讨论】:

    • 对不起;这是我想出一个人为的例子的错。我已经编辑了问题。
    • (其实那篇博文正是我转载的情况,只是我在添加XmlSchema时开始出现问题)
    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2015-06-21
    • 1970-01-01
    • 2010-10-20
    • 2016-12-03
    相关资源
    最近更新 更多