online - Anotaciones JAXB XmlID y XmlIDREF(Esquema a Java)
wsdl2java cxf example (3)
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 objetos durante el marshalling / unmarshalling.
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 tipos anotados con @XmlIDREF son las mismas instancias (como en ==) que aquellas 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 que pueda personalizar los enlaces JAXB de modo que los tipos de referencias sean java.lang.String (para que coincida con el ID del tipo al que se hace referencia) o lo mismo que el tipo al que se hace referencia?
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 descubro 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>
OK, entonces esto no va a funcionar. No es posible que JAXB genere 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 a XML Schema lo haría! :)
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 de 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">