J'ai donc lu sur l'utilisation des ID et IDREF dans JAXB here, et dans l'exemple présenté, ils utilisent 1 élément IDREF, qui apparaît comme un objet dans le Java généré code. J'inclus à la fois le schéma XML ...Incohérence JAXB entre 1 IDREF et plus de 1
<xsd:complexType name="CustomerType">
<xsd:sequence>
<xsd:element name="id" type="xsd:ID"/>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="OrderType">
<xsd:sequence>
<xsd:choice>
<xsd:element name="customer" type="CustomerType"/>
<xsd:element name="custref" type="xsd:IDREF"/>
</xsd:choice>
<xsd:element name="items" type="ItemType" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
et le code Java pour la postérité.
public class OrderType {
protected CustomerType customer;
protected Object custref;
protected List items;
public CustomerType getCustomer() {
return customer;
}
public void setCustomer(CustomerType value) {
this.customer = value;
}
public Object getCustref() {
return custref;
}
public void setCustref(Object value) {
this.custref = value;
}
public List getItems() {
if (items == null) {
items = new ArrayList();
}
return this.items;
}
}
Maintenant, dans mon code, j'ai essayé quelque chose d'un peu différent, illustré par le schéma suivant:
<xsd:complexType name="SimViewType">
<xsd:sequence>
<xsd:element name="NAME" type="xsd:string"></xsd:element>
<xsd:element name="ITEM" type="am:SimItemIDREF" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:ID" use="required"></xsd:attribute>
</xsd:complexType>
<xsd:simpleType name="SimItemIDREF">
<xsd:restriction base="xsd:IDREF"></xsd:restriction>
</xsd:simpleType>
Bien que j'ai joint un IDREF général avec un SimItemIDREF, il est juste pour une meilleure lisibilité. Cependant, même si j'utilise un xsd normal: IDREF à la place, le simple fait que j'utiliser une valeur autre que 1 signifie que mon code Java se termine par ce qui suit ...
public class SimViewType {
...
protected List<JAXBElement<Object>> item;
...
}
Au lieu d'un List<Object>
, je reçois un List<JAXElement<Object>>
. Maintenant, si je veux faire un JAXElement, je peux le faire très bien, mais je ne peux pas l'ajouter à mon SimViewType car il n'y a pas de conversion entre JAXElement<SimItemType>
et JAXElement<Object>
. L'idée que SimViews ne conserve pas réellement le contrôle de SimItems est cruciale dans ma conception, donc la simple suppression de références n'est pas une bonne idée car cela peut créer des divergences dangereuses au moment de l'exécution.
Comment puis-je créer un SimItemType ou un JAXBElement de sorte que je puisse l'utiliser avec mon SimViewType?
Comment avez-vous résoudre ce problème? Je suis confronté à un problème similaire - j'ai un élément déclaré avec 'type =" xs: IDREF "maxoccurs =" unbounded "' et annoté avec un type de base, et le type est déclaré correctement dans la classe Java, mais à l'exécution c'est une liste> à la place. –
undefined