Аннотации JAXB XmlID и XmlIDREF (от схемы до Java)

Я предоставляю веб-службу с помощью CXF. Я использую аннотации @XmlID и @XmlIDREF JAXB для поддержания ссылочной целостности моего графа объектов во время сортировки/демаршаллинга.

WSDL правильно содержит элементы с атрибутами xs:id и xs:idref для представления этого.

На стороне сервера все работает очень хорошо. Экземпляры типов, аннотированные @XmlIDREF, являются теми же экземплярами (как в ==), что и экземпляры, аннотированные аннотацией @XmlID.

Однако, когда я создаю клиент с помощью WSDLToJava, ссылки (аннотированные с помощью @XmlIDREF) имеют тип java.lang.Object.

Есть ли способ настроить привязки JAXB таким образом, чтобы типы ссылок были либо java.lang.String (чтобы соответствовать идентификатору ссылочного типа), либо совпадали с самим ссылочным типом?


person kipz    schedule 13.01.2009    source источник


Ответы (3)


Используйте встроенные привязки JAXB, чтобы указать тип, который будет использоваться. Тогда сгенерированный код JAXB будет иметь правильный тип.

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

Также обратите внимание, что вы должны объявить пространство имен jaxb и версию JAXB в элементе 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">
person Abhinav Sarkar    schedule 09.04.2010

Следующее, кажется, по крайней мере создает строковые свойства для элементов/атрибутов типа xs:IDREF. Хорошее начало, но в идеале JAXB должен генерировать свойства того же типа, что и элемент, на который делается ссылка. Я отчитаюсь, если/когда узнаю, как это сделать. Этот результат может указывать на то, что мне нужно написать свои собственные преобразователи, что было бы позором.

<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>
person kipz    schedule 14.01.2009

Хорошо, так что это не сработает. JAXB не может генерировать код с правильными типами для IDREF, потому что схема не может указывать типы ссылок, и IDREF могут указывать на разные сложные типы. Как JAXB узнает, каковы типы ссылок? Расширение XML-схемы сделало бы это! :)

person kipz    schedule 14.01.2009