TL; DR: код и аннотации, сгенерированные xjc + jaxb2-annotate + xew, не дают желаемой (или, в этом отношении, работающей из коробки) структуры xml, которая должна быть коллекциейЭлементы IDREF.
Если я вручную изменю атрибуты jaxb коллекции в сгенерированном коде, она будет работать так, как я ожидаю.
То, что сгенерировано:
@XmlElementWrapper(required = true) // from xew
@XmlElementRef(name = "investigator", namespace = "http://example/test", type = JAXBElement.class)
protected List<PersonType> investigators;
То, что я хочу:
@XmlElementWrapper(required = true) // from xew
@XmlElement(name = "investigator", required = true, type = Object.class)
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected List<PersonType> investigators;
Сгенерированные аннотации выдают исключение во время выполнения, говоря, что PersonType не имеет XmlRootElement.Если я добавлю это, он будет работать, но коллекция XML неверна, имеяэлементы вместо элементов.
Мой вопрос заключается в том, как заставить xjc генерировать (что я считаю «правильными») аннотации?
С учетом этой схемы:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example/test"
xmlns="http://example/test" elementFormDefault="qualified" >
<xs:element name="test_metadata" type="test_document_type"/>
<xs:complexType name="test_document_type">
<xs:sequence>
<xs:element name="investigators" >
<xs:complexType>
<xs:sequence>
<xs:element name="investigator" type="xs:IDREF" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="dataSubmitter" type="xs:IDREF" />
<xs:element name="people">
<xs:complexType>
<xs:sequence>
<xs:element name="person" type="person_type" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="person_type" id="ref_id">
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="organization" type="xs:string" />
<xs:element name="contactInfo" type="xs:string" />
<xs:element name="identifier" type="xs:string" minOccurs="0" maxOccurs="unbounded" nillable="true" />
<xs:element name="link" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="ref_id" type="xs:ID" use="required"/>
</xs:complexType>
</xs:schema>
и этих настроек привязки xjc:
<jaxb:bindings node="xs:complexType[@name='test_document_type']//xs:element[@name='investigators']//xs:element[@name='investigator']">
<jaxb:property>
<jaxb:baseType name="PersonType"/>
</jaxb:property>
</jaxb:bindings>
<jaxb:bindings node="xs:complexType[@name='test_document_type']//xs:element[@name='dataSubmitter']">
<jaxb:property>
<jaxb:baseType name="PersonType"/>
</jaxb:property>
</jaxb:bindings>
(соответствующий) сгенерированный код:
public class TestDocumentType implements Serializable
{
@XmlElementWrapper(required = true)
@XmlElementRef(name = "investigator", namespace = "http://example/test", type = JAXBElement.class)
protected List<PersonType> investigators;
@XmlElement(required = true, type = Object.class)
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected PersonType dataSubmitter;
@XmlElementWrapper(required = true)
@XmlElement(name = "person", namespace = "http://example/test")
protected List<xml.test.PersonType> people;
}
Обратите внимание на @XmlElementRef(name = "investigator", namespace = "http://example/test", type = JAXBElement.class)
Когда я использую этот сгенерированный код для создания Java-объекта с парой человек и человек (все также в коллекции ), а затем попытайтесь сериализовать, используя jaxb, выбрасывается исключение missing an @XmlRootElement annotation
, упомянутое выше.
Теперь, если я вручную изменю примечания в поле List<PersonType> investigators
на
@XmlElement(name = "investigator", required = true, type = Object.class)
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected List<PersonType> investigators;
изапустив код, я получаю ожидаемую коллекцию элементов IDREF:
<test_metadata xmlns="http://example/test">
<investigators>
<investigator>JohnHDoe</investigator>
<investigator>JackSmith</investigator>
</investigators>
<dataSubmitter>JohnHDoe</dataSubmitter>
<people>
<person ref_id="JohnHDoe">
<name>John H Doe</name>
<organization>semi</organization>
<contactInfo>tweedy</contactInfo>
</person>
<person ref_id="JackSmith">
<name>Jack Smith</name>
<organization>fully</organization>
<contactInfo>whistler</contactInfo>
</person>
</people>
</test_metadata>
Существуют ли какие-либо настройки управления или привязки, которые необходимы для исправления аннотаций jaxb в коллекции?Или другой способ получить ту же структуру XML?
Спасибо