Anotaciones JAXB XmlID y XmlIDREF (Schema to Java)
Pregunta
Estoy exponiendo un servicio web usando CXF. Estoy usando las anotaciones @XmlID y @XmlIDREF JAXB para mantener la integridad referencial de mi gráfico de objeto durante la clasificación / descomposición.
El WSDL correctamente contiene elementos con los atributos xs: id y xs: idref para representar esto.
En el lado del servidor, todo funciona muy bien. Las instancias de los tipos anotados con @XmlIDREF son las mismas instancias (como en ==) a las anotadas con la anotación @XmlID.
Sin embargo, cuando genero un cliente con WSDLToJava, las referencias (aquellas anotadas con @XmlIDREF) son del tipo java.lang.Object.
¿Hay alguna forma de personalizar los enlaces JAXB de modo que los tipos de referencias sean java.lang.String (para que coincida con el ID del tipo referenciado) o el mismo que el tipo referenciado?
Solución 3
Bien, entonces esto no va a funcionar. JAXB no puede generar código con los tipos correctos para los IDREF porque el esquema no puede especificar los tipos de referencias y puede haber IDREF apuntando a diferentes tipos complejos. ¿Cómo sabría JAXB cuáles son los tipos de referencias? ¡Una extensión del esquema XML lo haría! :)
Otros consejos
Utilice los enlaces JAXB en línea para indicar el tipo que se utilizará. Entonces el código generado por JAXB tendrá el tipo correcto.
<complexType name="Column">
<sequence>
<element name="name" type="string" maxOccurs="1" minOccurs="1"></element>
<element name="referencedColumn" type="IDREF" maxOccurs="1" minOccurs="0">
<annotation>
<appinfo>
<jaxb:property>
<jaxb:baseType name="Column"/>
</jaxb:property>
</appinfo>
</annotation>
</element>
</sequence>
<attribute name="id" type="ID" use="required"></attribute>
</complexType>
También tenga en cuenta que debe declarar el espacio de nombres jaxb
y la versión JAXB en el elemento schema
.
<schema targetNamespace="http://example.com/schema"
elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0">
Lo siguiente parece al menos crear propiedades de cadena para elementos / atributos de tipo xs: IDREF. Un buen comienzo, pero idealmente JAXB generaría propiedades del mismo tipo que el elemento al que se hace referencia. Informaré si / cuando descubra cómo hacerlo. Este resultado puede indicar que necesito escribir mis propios convertidores, lo que sería una pena.
<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:globalBindings>
<jxb:javaType name="java.lang.String" xmlType="xs:IDREF" parseMethod="javax.xml.bind.DatatypeConverter.parseString" printMethod="javax.xml.bind.DatatypeConverter.printString" />
</jxb:globalBindings>
</jxb:bindings>