2016-11-30 2 views
5

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.

+0

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

+1

Question similaire - https://stackoverflow.com/questions/41608667/axis-jaxb-unmarshal-not-working-with-any-jdk-except-jdk-1-8-077 –

Répondre

1

Je pense que cela est le bug pertinent - https://bugs.openjdk.java.net/browse/JDK-8165299

D'où je peux dire qu'il y avait bien une solution pour JAXB. Donc, ce comportement étrange qui se termine par des valeurs nulles est un mauvais mappage JAXB et non une régression en Java.

+0

Bonne trouvaille. Cependant, ce bug a été fermé en tant que "Pas un problème". Donc pas de solution. – sleske

+0

Je pense que vous devriez corriger votre mapping JAXB. –