【问题标题】:JAXB: Namespace annotation not inherited during unmarshalling - regression in JDK 1.8_102?JAXB:解组期间未继承命名空间注释 - JDK 1.8_102 中的回归?
【发布时间】:2016-11-30 13:16:09
【问题描述】:

我遇到了一种情况,即 JAXB 拒绝解组 XML 元素,除非相应的 Java 字段具有命名空间注释。此行为仅在 JDK 1.8.0_111(或可能在 102)中开始。 JDK 1.8 的早期版本也可以工作。

测试用例:

Java 类(缩写):

package my.package;
@XmlRootElement(name = "MyElement", namespace="myns")
public class MyElement {
    @XmlElement(name = "subEl")
    private String subEl;
}

XML:

<MyElement xmlns="myns">
    <subEl>text1</subEl>
</MyElement>

包信息.java:

@XmlSchema(elementFormDefault = XmlNsForm.QUALIFIED)
package my.package;

解组代码:

    JAXBContext jc = JAXBContext.newInstance(MyElement.class);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    MyElement myel = (MyElement) unmarshaller.unmarshal(xmlStream);
    System.out.println("Parse result: "+ myel);

使用 JDK 1.8.0_101(及更早版本)会打印:

解析结果:MyElement [subEl=subEl]

使用 JDK 1.8.0_111 我得到:

解析结果:MyElement [subEl=null]

所以 JDK 1.8.0_111 拒绝解组元素“MyElement”。

如果我在字段注释上指定命名空间:

    @XmlElement(name = "subEl", namespace="myns")
    private String subEl;

它在所有 JDK 版本中都能正常工作。


这是怎么回事?

据我了解,设置 elementFormDefault = XmlNsForm.QUALIFIED 应该会导致 MyElement 类的所有字段“继承”该类的命名空间。 Javadocs for @XmlElement 说:

如果值为“##default”,则命名空间被确定为 如下:

如果封闭包有 XmlSchema 注释,并且它的 elementFormDefault 是 QUALIFIED,然后是封闭的命名空间 班级。否则 '' (在默认情况下会产生不合格的元素 命名空间。

默认值:“##default”

那么为什么 JDK 1.8.0_111 不解组元素呢?

注意:JAXB 错误报告 #1087 - Unmarshalling Wrapped elements with elementForName=qualified fails(以前在 JAXB-1087- Unmarshalling Wrapped elements with elementForName=qualified fails)似乎报告了同样的问题 - 目前没有任何回应。

【问题讨论】:

标签: java xml jaxb xml-namespaces unmarshalling


【解决方案1】:

我认为这是相关的错误 - https://bugs.openjdk.java.net/browse/JDK-8165299

我可以说确实有一个针对 JAXB 的 fix。 所以这种以空值结尾的奇怪行为是错误的 JAXB 映射,而不是 Java 中的回归。

【讨论】:

  • 很好的发现。但是,该错误已被关闭为“不是问题”。所以没有修复。
  • 我认为你应该修复你的 JAXB 映射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2014-11-07
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多