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?

¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top