JAXB: аннотация пространства имен не наследуется во время демаршаллинга - регрессия в JDK 1.8_102?
Я столкнулся с ситуацией, когда 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 для@XmlElement
сказать:
Если значение равно «## default», то пространство имен определяется следующим образом:
Если вмещающий пакет имеет аннотацию XmlSchema, а его elementFormDefault имеет значение QUALIFIED, то пространство имен вмещающего класса. В противном случае '' (который создает неквалифицированный элемент в пространстве имен по умолчанию.
По умолчанию: "## default"
Так почему же JDK 1.8.0_111 не демаршал элемент?
Примечание: отчет об ошибке JAXB# 1087 - Немаршаллинг обернутых элементов с elementForName = квалифицированным сбоем (ранее вJAXB-1087 - немаршалинг обернутых элементов с elementForName = квалифицированные ошибки), кажется, сообщает ту же проблему - пока нет ответа.