【发布时间】: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)似乎报告了同样的问题 - 目前没有任何回应。
【问题讨论】:
-
这个 JDK 错误看起来相关(虽然不一样):JDK-8134111 : Unmarshaller unmarshalls XML element which doesn't have the expected namespace.
标签: java xml jaxb xml-namespaces unmarshalling