Аннотации JAXB XmlID и XmlIDREF (схема на Java)
Вопрос
Я раскрываю веб-сервис с использованием 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>