2010-02-22 4 views
4

J'ai un problème de génération de classe JAXB J'espérais obtenir de l'aide. Voici la partie du XML qui est la source de mon problème ...JAXB: Unmarshalling ne remplit pas toujours certaines classes?

<xs:complexType name="IDType"> 
<xs:choice minOccurs="0" maxOccurs="2"> 
    <xs:element name="DriversLicense" minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="SSN"  minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="CompanyID"  minOccurs="0" maxOccurs="1" type="an..35" /> 
    </xs:choice> 
</xs:complexType> 
<xs:simpleType name="an..35"> 
    <xs:restriction base="an"> 
    <xs:maxLength value="35" /> 
    </xs:restriction> 
</xs:simpleType> 

<xs:simpleType name="an"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="[ !-~]*" /> 
    </xs:restriction> 
</xs:simpleType> 

... maintenant cela va générer JAXBElement types parce que son choice avec un maxOccurs > 1. Je veux éviter ceux-ci, donc je l'ai fait en modifiant le code pour utiliser un élément « wrapper » et déplacer le maxOccurs jusqu'à une étiquette de la séquence suivante ...

<xs:complexType name="IDType"> 
<xs:sequence maxOccurs="2"> 
    <xs:element name=Wrapper> 
    <xs:complexType> 
    <xs:choice> 
    <xs:element name="DriversLicense" minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="SSN"  minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="CompanyID"  minOccurs="0" maxOccurs="1" type="an..35" /> 
    </xs:choice> 
    </xs:complexType> 
    </xs:element> 
</xs:sequence> 
</xs:complexType> 

<xs:simpleType name="an..35"> 
    <xs:restriction base="an"> 
    <xs:maxLength value="35" /> 
    </xs:restriction> 
</xs:simpleType> 

<xs:simpleType name="an"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="[ !-~]*" /> 
    </xs:restriction> 
</xs:simpleType> 

pour générer de classe, ressemble à cela fonctionne great - l'élément JAXB est remplacé par une liste de wrappers comme String (c'est-à-dire List<IDType.Wrapper<String>) et compile bien.

Cependant, lorsque je démasque les données XML réelles dans les classes générées, les données de la classe wrapper ne sont pas remplies - et pourtant JAXB ne lance pas d'exception.

Ma question est: Ai-je besoin de changer le schéma d'une manière différente pour que cela fonctionne? Ou y a-t-il quelque chose que je peux ajouter/modifier/supprimer au code généré ou aux annotations?

Répondre

3

Pas une mauvaise idée, mais notez ce qui suit: selon votre schéma, il est parfaitement légal que votre élément "Wrapper" n'a pas de contenu. Il contient un choix d'éléments optionnels.

Deuxièmement, vous ne pouvez pas avoir de validation de schéma sur; alors JAXB ne se plaindra pas si vos documents sont brisés. Si vous voulez activer la validation de schéma, obtenez un Unmarshaller et initialisez comme ceci:

unmarshaller.setValidating(true); 
SchemaFactory sf = SchemaFactory.newInstance(
    javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = sf.newSchema(new File("my-schema.xsd")); 
unmarshaller.setSchema(schema); 
+0

Merci pour la réponse rapide. Je vous en suis reconnaissant. Oui, j'ai un validateur et c'est là que je l'ai attrapé - comme vous l'avez dit. Cependant, en mode débogage, *** après *** unmarshalling XML qui avait deux instances si le wrapper IDType (c'est-à-dire DriversLicense et SSN dans ce cas), j'ai regardé les classes et j'ai remarqué qu'elles n'étaient vraiment pas peuplées. Ainsi, même si la classe Wrapper a été générée, unmarshalling a échoué quand il ne devrait pas l'être. Avez-vous des idées pourquoi? Des suggestions pour modifier les personnalisations XML ou les liaisons? Merci encore! – user278458

Questions connexes