Вопрос

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

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

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

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

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

Это было полезно?

Решение 3

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

Другие советы

Используйте встроенные привязки 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">

Кажется, что по крайней мере следующее создает строковые свойства для элементов / атрибутов типа 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top