2016-11-30 12 views
5

我遇到了JAXB拒绝解组一个XML元素的情况,除非相应的Java字段有一个名称空间注释。此行为仅在JDK 1.8.0_111(或可能在102)中启动。早期版本的JDK 1.8可以工作。JAXB:解组期间未继承的名称空间注释 - JDK 1.8_102中的回归?

测试用例:

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 =空]

因此,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是合格的,那么封闭的 类的命名空间。否则 ''(产生不合格的元素在默认 命名空间

默认: “##默认”

那么,为什么JDK 1.8.0_111不是解组元素

注意事项? :JAXB错误报告#1087 - Unmarshalling Wrapped elements with elementForName=qualified fails(以前在JAXB-1087- Unmarshalling Wrapped elements with elementForName=qualified fails)似乎报告同样的问题 - 迄今为止没有回应。

+0

此JDK错误看起来相关(尽管不相同):[JDK-8134111:Unmarshaller unmarshalls XML元素没有预期的命名空间](http://bugs.java.com/bugdatabase/view_bug.do? bug_id = 8134111)。 – sleske

+1

类似的问题 - https://stackoverflow.com/questions/41608667/axis-jaxb-unmarshal-not-working-with-any-jdk-except-jdk-1-8-077 –

回答

1

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

从中我可以说,确实有用于JAXB一个修复。 因此,这种以空值结尾的奇怪行为是错误的JAXB映射,而不是Java中的回归。

+0

好找。但是,该错误被视为“不是问题”。所以没有修复。 – sleske

+0

我认为你应该修复你的JAXB映射。 –