JAXB XMLID e XMLIDREF Anotações (Esquema para Java)
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?
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>