2016-11-30 18 views
5

Я столкнулся с ситуацией, когда 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), похоже, сообщает о той же проблеме - ответа пока нет.

+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

Я думаю, что это отношение ошибка - https://bugs.openjdk.java.net/browse/JDK-8165299

Из чего я могу сказать, что там было действительно исправление для JAXB. Таким образом, это странное поведение, которое заканчивается нулевыми значениями, является неправильным отображением JAXB, а не регрессией в Java.

+0

Хорошая находка. Однако эта ошибка была закрыта как «Не проблема». Так что ничего страшного. – sleske

+0

Я думаю, вы должны исправить ваше сопоставление JAXB. –