Je me suis heurté à une situation où JAXB refuse de démaseler un élément XML à moins que le champ Java correspondant ait une annotation d'espace de noms. Ce comportement a démarré uniquement dans JDK 1.8.0_111 (ou éventuellement dans 102). Les versions antérieures de JDK 1.8 fonctionnent.JAXB: Annotation d'espace de noms non héritée pendant unmarshalling - régression dans JDK 1.8_102?
Cas de test:
classe Java (raccourci):
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;
Code unmarshalling:
JAXBContext jc = JAXBContext.newInstance(MyElement.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MyElement myel = (MyElement) unmarshaller.unmarshal(xmlStream);
System.out.println("Parse result: "+ myel);
Avec 1.8.0_101 JDK (et versions antérieures) cette impression:
résultat Parse: MyElement [Subel = Subel]
Avec 1.8.0_111 I JDK obtenir:
résultat Parse: MyElement [Subel = null]
Donc JDK 1.8.0_111 refuse de démarsaliser l'élément "MyElement".
Si je spécifie l'espace de noms sur l'annotation sur le terrain:
@XmlElement(name = "subEl", namespace="myns")
private String subEl;
cela fonctionne comme prévu dans toutes les versions de JDK.
Que se passe-t-il ici? Pour autant que je sache, le paramètre elementFormDefault = XmlNsForm.QUALIFIED
doit faire en sorte que tous les champs de la classe MyElement "héritent" de l'espace de noms de la classe. Le Javadocs for @XmlElement
disent:
Si la valeur est « par défaut ## », l'espace de noms est déterminé comme suit:
Si le paquet englobante a annotation XmlSchema, et son elementFormDefault est QUALIFIE, le espace de noms de la classe englobante. Dans le cas contraire '' (qui produit élément non qualifié dans le défaut espace de noms
Valeur par défaut:. "Default ##"
Alors, pourquoi ne pas désorganiser 1.8.0_111 JDK l'élément
Remarque? : Rapport de bug JAXB #1087 - Unmarshalling Wrapped elements with elementForName=qualified fails (anciennement à JAXB-1087- Unmarshalling Wrapped elements with elementForName=qualified fails) semble signaler le même problème - aucune réponse jusqu'à présent.
Ce bogue JDK est lié (mais pas identique): [JDK-8134111: élément XML Unmarshaller unmarshalls qui n'a pas l'espace de nom attendu] (http://bugs.java.com/bugdatabase/view_bug.do? bug_id = 8134111). – sleske
Question similaire - https://stackoverflow.com/questions/41608667/axis-jaxb-unmarshal-not-working-with-any-jdk-except-jdk-1-8-077 –