我遇到了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>
package-info.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)似乎报告了同样的问题 - 到目前为止没有回复。
答案 0 :(得分:1)
我认为这是相关的错误 - https://bugs.openjdk.java.net/browse/JDK-8165299
我可以说JAXB确实存在修复。 因此,这种以空值结尾的奇怪行为是错误的JAXB映射,而不是Java中的回归。