comando - xsd to java jaxb
especificar el tipo para IDREF en el esquema XML (2)
Estoy generando objetos Java desde un esquema XML usando xjc. Me gustaría hacer referencia al mismo elemento varias veces dentro del documento usando IDREF. También me gustaría restringir los objetos referenciados por IDREF a un tipo específico. Me gustaría hacer esto para fines de validación de esquema, pero también para que en el código de Java, el objeto al que se hace referencia se devuelva como un tipo específico en lugar de escribir Object. Por ejemplo, supongamos que quiero un esquema para describir lo siguiente:
<teams>
<team id="team1">
<coach>coachz</coach>
<player>homestar</player>
<player>marzipan</player>
<player>strongsad</player>
<player>strongbad</player>
</team>
<team id="team2">
<coach>bubs</coach>
<player>homesar</player>
<player>thecheat</player>
<player>poopsmith</player>
<player>bubs</player>
</team>
<team id="allstars">
<coach>poopsmith</coach>
<player>coachz</player>
<player>bubs</player>
<player>kingoftown</player>
<player>strongbad</player>
</team>
</teams>
<people>
<person id="coachz">Coach Z</person>
<person id="homesar">Homesar</person>
<person id="homestar">Homestar</person>
<person id="strongbad">Strong Bad</person>
<person id="strongsad">Strong Sad</person>
<person id="marzipan">Marzipan</person>
<person id="bubs">Bubs</person>
<person id="kingoftown">King of Town</person>
<person id="poopsmith">The Poopsmith</person>
<person id="thecheat">The Cheat</person>
</people>
Puedo definir un player
así:
<xs:element name="player" type="xs:IDREF" maxOccurs="unbounded"/>
pero luego, en el código de Java, cuando intento recuperar un jugador, volverá a aparecer como un tipo de objeto, y tengo que lanzarlo a una persona. En ese momento, si alguien ha hecho referencia erróneamente a un objeto Team, tengo errores con los que lidiar que podrían haber sido detectados en la validación. Quiero especificar algo como esto:
<xs:element name="player" type="xs:IDREF"
reftype="person"
maxOccurs="unbounded" />
Pero hasta donde puedo decir, no hay forma de especificar un tipo como lo he hecho aquí con el atributo artificial ''reftype''. ¿Se puede hacer esto, usando IDREF? Si no, ¿hay otro método?
La respuesta de lexicore me dio lo que necesito (y sugiero votar su respuesta sobre la mía). Sin embargo, estoy usando anotaciones en línea en lugar de un archivo de enlaces por separado. Esto es lo que parece con las anotaciones en línea, usando mi ejemplo de Homestar:
<xs:element name="player" type="xs:IDREF" maxoccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<jaxb:property>
<jaxb:baseType name="Person"/>
</jaxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
Simplemente puede aplicar el enlace baseType
a su elemento de player
. Algo como:
<jaxb:bindings node="xsd:element[@name=''player'']">
<jaxb:property>
<jaxb:baseType name="....Person"/>
</jaxb:property>
</jaxb:bindings>
Es posible que deba averiguar la ubicación de enlace correcta para su esquema.
Ejemplo de mi código:
Esquema:
<xsd:complexType name="HJIII-53-A">
<xsd:sequence>
<xsd:element name="b" type="xsd:IDREF"/>
<xsd:element name="b1" type="test:HJIII-53-B"/>
<xsd:element name="c" type="xsd:IDREFS"/>
<xsd:element name="c1" type="test:HJIII-53-C" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
Vinculaciones:
<jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
<jaxb:globalBindings localScoping="toplevel">
<jaxb:serializable/>
</jaxb:globalBindings>
<jaxb:bindings node="xsd:complexType[@name=''HJIII-53-A'']//xsd:element[@name=''b'']">
<jaxb:property>
<jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B"/>
</jaxb:property>
</jaxb:bindings>
<jaxb:bindings node="xsd:complexType[@name=''HJIII-53-A'']//xsd:element[@name=''c'']">
<jaxb:property>
<jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C"/>
</jaxb:property>
</jaxb:bindings>
</jaxb:bindings>
Código generado:
@XmlElement(required = true, type = Object.class)
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b;
@XmlElement(required = true)
protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b1;
@XmlList
@XmlElement(required = true, type = Object.class)
@XmlIDREF
protected List<org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C> c;
protected List<org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C> c1;
Ver: https://svn.java.net/svn/hj3~svn/trunk/ejb/tests/issues-jpa2/src/main/resources/