JAXB:在解组期间未继承的命名空间注释 - JDK 1.8_102中的回归?

sle*_*ske 5 java xml jaxb xml-namespaces unmarshalling

我遇到了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;
}
Run Code Online (Sandbox Code Playgroud)

XML:

<MyElement xmlns="myns">
    <subEl>text1</subEl>
</MyElement>
Run Code Online (Sandbox Code Playgroud)

package-info.java:

@XmlSchema(elementFormDefault = XmlNsForm.QUALIFIED)
package my.package;
Run Code Online (Sandbox Code Playgroud)

解组代码:

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

使用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;
Run Code Online (Sandbox Code Playgroud)

它在所有JDK版本中都按预期工作.


这里发生了什么?

据我所知,该设置elementFormDefault = XmlNsForm.QUALIFIED应该导致类MyElement的所有字段"继承"该类的命名空间.该Javadoc文档@XmlElement说:

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

如果封闭包具有XmlSchema批注,并且其elementFormDefault为QUALIFIED,则为封闭类的命名空间.否则''(它在默认命名空间中生成非限定元素.

默认值:"## default"

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

注意:JAXB错误报告#1087 - 解组使用elementForName =限定的包装元素失败(以前在JAXB-1087-解组包含elementForName =合格的Wrapped元素失败)似乎报告了同样的问题 - 到目前为止没有响应.

And*_*cev 1

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

由此我可以说 JAXB 确实得到了修复。因此,这种以空值结束的奇怪行为是错误的 JAXB 映射,而不是 Java 中的回归。