JAXB: anotação de espaço para nome não herdada durante a desserialização - regressão no JDK 1.8_102?
Eu me deparei com uma situação em que o JAXB se recusa a remover o ordenamento de um elemento XML, a menos que o campo Java correspondente tenha uma anotação de espaço para nome. Esse comportamento foi iniciado apenas no JDK 1.8.0_111 (ou possivelmente em 102). As versões anteriores do JDK 1.8 funcionam.
Caso de teste:
Classe Java (reduzida):
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;
Código de cancelamento de distribuição:
JAXBContext jc = JAXBContext.newInstance(MyElement.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MyElement myel = (MyElement) unmarshaller.unmarshal(xmlStream);
System.out.println("Parse result: "+ myel);
Com o JDK 1.8.0_101 (e versões anteriores), isso imprime:
Analisar resultado: MyElement [subEl = subEl]
Com o JDK 1.8.0_111, recebo:
Analisar resultado: MyElement [subEl = null]
Portanto, o JDK 1.8.0_111 se recusa a remover o controle do elemento "MyElement".
Se eu especificar o espaço para nome na anotação de campo:
@XmlElement(name = "subEl", namespace="myns")
private String subEl;
funciona como esperado em todas as versões do JDK.
O que está acontecendo aqui?
Tanto quanto eu entendo, a configuraçãoelementFormDefault = XmlNsForm.QUALIFIED
deve fazer com que todos os campos da classe MyElement "herdam" o espaço para nome da classe. oJavadocs para@XmlElement
dizer:
Se o valor for "## default", o espaço para nome será determinado da seguinte maneira:
Se o pacote anexo tiver anotação XmlSchema e seu elementFormDefault for QUALIFIED, o espaço para nome da classe envolvente. Caso contrário '' (que produz um elemento não qualificado no espaço para nome padrão.
Padrão: "## default"
Então, por que o JDK 1.8.0_111 não desseleciona o elemento?
Nota: Relatório de bug do JAXB# 1087 - Desfazer a remoção de elementos agrupados com elementForName = falha qualificada (anteriormente emJAXB-1087- Desmarcação de elementos agrupados com elementForName = falha qualificada) parece relatar o mesmo problema - nenhuma resposta até o momento.