Я столкнулся с ситуацией, когда JAXB отказывается от unmarshal XML-элемента, если соответствующее поле Java не имеет аннотации пространства имен. Это поведение запускается только в JDK 1.8.0_111 (или, возможно, в 102). Более ранние версии JDK 1.8 работают.JAXB: аннотация аннотации пространства имен не унаследована во время unmarshalling - регрессия в 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 I получить:
Синтаксическая результат: MyElement [subEl = нуль]
Таким образом, JDK 1.8.0_111 отказывается от отмены элемента «MyElement».
Если я указать пространство имен на поле аннотацию:
@XmlElement(name = "subEl", namespace="myns")
private String subEl;
он работает, как ожидается, во всех версиях JDK.
Что здесь происходит?
Насколько я понимаю, настройка elementFormDefault = XmlNsForm.QUALIFIED
должна приводить ко всем полям класса MyElement «наследовать» пространство имен класса. Javadocs for @XmlElement
говорят:
Если значение «## по умолчанию», то пространство имен определяется следующим образом:
Если пакет вшита имеет 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), похоже, сообщает о той же проблеме - ответа пока нет.
Эта ошибка JDK выглядит связанной (хотя и не такой): [JDK-8134111: Unmarshaller unmarshalls XML-элемент, который не имеет ожидаемого пространства имен] (http://bugs.java.com/bugdatabase/view_bug.do? bug_id = 8134111). – sleske
Аналогичный вопрос - https://stackoverflow.com/questions/41608667/axis-jaxb-unmarshal-not-working-with-any-jdk-except-jdk-1-8-077 –