xjc генерирует некорректные аннотации jaxb для сбора элементов IDREF

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?

Спасибо

0 ответов

Другие вопросы по тегам