Pergunta

Estou expondo um serviço da Web usando CXF. Estou usando as anotações JAXB @XMLID e @XMLIDREF JAXB para manter a integridade referencial do meu gráfico de objetos durante o marechalling/unarshalling.

O WSDL contém corretamente elementos com os atributos XS: ID e XS: IDREF para representar isso.

No lado do servidor, tudo funciona muito bem. Instâncias de tipos anotadas com @xmlidref são as mesmas instâncias (como em ==) para as anotadas com a anotação @xmlid.

No entanto, quando eu gero um cliente com wsdltojava, as referências (as anotadas com @xmlidref) são do tipo java.lang.Object.

Existe alguma maneira de personalizar as ligações JAXB, de modo que os tipos de referências sejam java.lang.string (para corresponder ao ID do tipo referenciado) ou o mesmo que o próprio tipo referenciado?

Foi útil?

Solução 3

Ok, então isso não vai funcionar. Não é possível que o JAXB gerar código com os tipos corretos para os IDREFs, porque o esquema não pode especificar os tipos de referências e pode haver apontando para diferentes tipos complexos. Como o JAXB saberia quais são os tipos de referências? Uma extensão do esquema XML faria isso! :)

Outras dicas

Use as ligações JAXB embutidas para indicar o tipo a ser usado. Em seguida, o código gerado pelo JAXB terá o tipo correto.

<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>

Observe também que você precisa declarar o jaxb namespace e versão JAXB no schema elemento.

<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">

A seguir, parece pelo menos criar propriedades de string para elementos/atributos do tipo XS: IDREF. Um bom começo, mas, idealmente, o JAXB geraria propriedades do mesmo tipo que o elemento que está sendo referenciado. Vou relatar se/quando descobrir como fazer isso. Esse resultado pode indicar que eu preciso escrever meus próprios conversores, o que seria uma 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top