je un schéma XML:JAXB minOccurs = 0. L'élément existe ou pas?
<xsd:element name="Person">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string" />
<xsd:element name="lat" type="xsd:double" minOccurs="0"/>
<xsd:element name="lon" type="xsd:double" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Et j'ai un message XML:
<Person>
<name>Fred</name>
</Person>
J'utilise JAXB pour générer automatiquement mes cours (à savoir Person.java, etc.). Donc, au moment de l'exécution, j'utilise JAXB pour démâler le message XML ci-dessus et obtenir une instance d'objet Person. Quand je fais un p.getLat()
ou p.getLon()
les valeurs de retour sont 0.0 même si le XML original n'a pas contenu <lat>
ou <lon>
éléments. Ce qui rend cette situation pire est que 0,0, 0,0 est une latitude et une longitude valides. Il est rare qu'une personne soit localisée là mais c'est hors de propos! Un article sur le site IBM a suggéré d'utiliser un élément XML supplémentaire en tant que métadonnées pour indiquer explicitement si l'élément facultatif existe ou non. à savoir
<xsd:element name="hasLat" type="xsd:boolean"/>
<xsd:element name="hasLon" type="xsd:boolean"/>
Le message XML ci-dessus deviendrait:
<Person>
<name>Fred</name>
<hasLat>false</hasLat>
<hasLon>false</hasLon>
</Person>
Cela semble être une bidouille horrible. Il doit y avoir un moyen approprié avec JAXB pour vérifier si l'élément existait afin que je puisse faire confiance à la valeur de retour de mon getLat()
, getLon()
?
Utilisez-vous JAXB à partir de Java 6 ou de la bibliothèque séparée travaillant avec 1.5? Il y a eu des changements dans la façon dont JAXB génère des classes en cours de route. en particulier pour les tableaux. Essayez le dernier. –
J'utilise JAXME (sur Fedora le paquet est ws-jaxme-0.5.1-3.4.fc11.noarch) et Java 6 (java-1.6.0-openjdk-1.6.0.0-30.b16.fc11.i586) . –
Cela semble être un problème spécifique à l'implémentation JAXME de JAXB 2.0. Passant à l'implémentation de Sun, le getter renvoie une valeur nulle si l'élément n'a pas été inclus dans le message XML. –