java unmarshalling - valeur NULL ou d'une balise manquante?
J'ai un nillable champ dans une classe est définie par le unmarshaller:
@XmlElement(name = "value", nillable = true)
private BigDecimal valueVariable;
Mon problème est que je ne peux pas dire si l'élément xml a été omis ou la valeur nulle:
A. élément <value/>
est manquant dans le fichier XML, il n'est pas nécessaire.
=> (valueVariable == null) est vrai
B. fichier XML contient <value xsi:nil="true"/>
=> (valueVariable == null) est vrai
Comment puis-je dire pour une variable de Chaîne non si la valeur est xsi:nil
ou l'étiquette est manquante?
Mise à JOUR
Vous pouvez voir 2 bonnes solutions, j'ai préféré l'un d'entre eux, mais l'autre serait aussi bien!
OriginalL'auteur user1414745 | 2013-08-26
Vous devez vous connecter pour publier un commentaire.
JAXB (JSR-222) implémentations peuvent représenter
null
comme un absent ou un nœud nillable élément basé sur lenillable
réglage sur@XmlElement
. Lorsque vous avez besoin pour soutenir à la fois, ou de différencier entre les deux, alors vous pouvez tirer profit deJAXBElement
.Java Modèle
Racine
Champs/propriétés de type
JAXBElement
sont mappés avec les@XmlElementRef
annotation. Cela correspond à@XmlElementDecl
des annotations sur une classe annotée avec@XmlRegistry
.ObjectFactory
Le Code De Démonstration
input.xml
Démo
Ci-dessous quelques démo de code que vous pouvez exécuter pour montrer que tout fonctionne. Notez comment les
JAXBIntrospector
peut être utilisée pour obtenir la valeur réelle de déballage de l'JAXBElement
si nécessaire.Sortie
Mise à JOUR
Si vous vouliez maintenir votre existant méthodes get/set, alors vous pouvez garder sur le terrain que j'ai dans cette réponse, et de changer vos méthodes d'accès à ressembler à ce qui suit:
En plus, vous pouvez ajouter un
isSet
méthode pour voir si la valeur a été fixée.Cette approche ne nécessite pas que vous avez accès à la
Unmarshaller
. Assurez-vous que leObjectFactory
est ramassé, vous pouvez utiliser le@XmlSeeAlso
annotation de référence à partir de l'une des classes de votre domaine.@XmlElement(name = "value", nillable = true) private JAXBElement<BigDecimal> valueVariable;
, je n'utilise pas@XmlElementRef
. J'obtiens l'erreur:No default constructor found on class javax.xml.bind.JAXBElement java.lang.NoSuchMethodException: javax.xml.bind.JAXBElement.<init>()
Et BTW, c'est un service web et unmarshalling n'est pas contrôlée par moi.
Oh, maintenant je vois, juste pour changer le Type de la variable privée dans le
@XmlElement
deBigDecimal
àJAXBElement<BigDecimal>
n'est pas une solution. Je dois avoir la ObjectFactory trop. Alors, peut-être il sera plus facile de générer du code java à partir d'un fichier xsd...J'ai mis à jour ma réponse avec quelques informations supplémentaires peuvent vous être utiles.
OriginalL'auteur bdoughan
Il y a une question similaire ici: La manipulation des noeuds manquants avec JAXB. Il semble que, si l'élément est manquant, la méthode setter ne sera pas appelé. Donc, vous pourriez mettre un peu de logique dans la méthode pour déterminer si le nœud est manquant ou a une valeur vide.
OriginalL'auteur Xavi López
J'étais traitant de la même question,
Pour régler ce problème, j'ai créé un nouveau fichier dans le colis j'ai été marshaling de l'objet:
"package-info.java"
J'y ai ajouté:
Maintenant tout est ok
OriginalL'auteur Dimitris