JAXB Types de problème
J'ai un xsd qui ressemble à ceci (extrait):
<xs:complexType name="IDType">
<xs:choice minOccurs="1" maxOccurs="2">
<xs:element name="FileID" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="IDNumber1" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="Number" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="PNumber" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="SS" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="Player" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="Prior" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="BIN" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="Mutual" 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>
Pour quelque raison que c'est le code Java, qui est généré:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "IDType", propOrder = {
"fileID"
})
public class PatientIDType {
@XmlElementRefs({
@XmlElementRef(name = "FileED", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
@XmlElementRef(name = "IDNumber1", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
@XmlElementRef(name = "Number", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
@XmlElementRef(name = "PNumber", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
@XmlElementRef(name = "SS", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
@XmlElementRef(name = "Plaer", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
@XmlElementRef(name = "Prior", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
@XmlElementRef(name = "BIN", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
@XmlElementRef(name = "Mutual", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class)
})
protected List<JAXBElement<String>> fileID;
/**
* Gets the value of the fileID property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the fileID property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getFileID().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
*/
public List<JAXBElement<String>> getFileID() {
if (fileID == null) {
fileID = new ArrayList<JAXBElement<String>>();
}
return this.fileID;
}
Pourquoi la classe générée comme cela et tout simplement pas une sorte de tableau de chaîne? Je ne veux vraiment pas avoir à créer JAXBElements chaque fois que je veux créer quelque chose?
Comment puis-je générer des classes pour chacun des types de représenter simplement de chaîne ou quelque chose comme ça?
Merci d'avance,
Ian
- Assez remarque: votre schéma extrait de semble manquer (ou pas cité s'affiche pas correctement?).
Vous devez vous connecter pour publier un commentaire.
Ce code est généré en raison de la complexité de votre type, IDType, contient un choix avec un maxOccurrence plus d'un, ici:
<xs:choice minOccurs="1" maxOccurs="2">
Le contenu de cette liste sont des éléments avec différentes noms mais le même type. Cela n'a pas d'équivalent dans la norme que les modèles orientés objets. JAXB utilise ensuite la
JAXBElement
classe de contourner cela: unJAXBElement
encapsule un simple objet qui contient les données et l'attribue à uneQName
.Ainsi, vous pouvez lire à partir de cette liste et écrire à la liste, sans ambiguïté, en fournissant:
JAXBElement
dontgetValue()
méthode renvoie la chaîneLa JAXB spécification contient assez détaillé et assez complexe explications sur la manière de traiter avec répétition des choix et des séquences répétitives. Notez que si votre séquence figurant des objets de types différents ainsi que des noms différents, vous vous retrouvez avec Liste<Object>.
Qui a été la longue explication, maintenant, voici quelques options:
Votre ObejctFActory classe devrait avoir le createMethod pour thosr valeurs, quelque chose comme
Si vous utilisez le Soleil JAXB mise en œuvre, vous pouvez essayer de compiler avec le xjc:simple mode activé. Voir la documentation sur les simplifié de liaison pour un exemple. Il devrait tourner
à
Vous aurez besoin de compiler votre schéma avec une liaison de personnalisation de fichier. Voir Kohsuke nous blog pour un exemple de comment le faire.