xjc生成不正确的jaxb注释以收集IDREF元素

时间:2019-04-12 20:03:58

标签: xml xsd jaxb xjc jaxb2-annotate-plugin

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,{{ 1}}引发了上述异常。

现在,如果我手动更改 missing an @XmlRootElement annotation字段

List<PersonType> investigators

并运行代码,我得到了IDREF元素的预期集合:

@XmlElement(name = "investigator", required = true, type = Object.class)
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected List<PersonType> investigators;

是否需要一些控件或绑定自定义项来更正集合上的jaxb批注?还是获得相同XML结构的另一种方法?

谢谢

0 个答案:

没有答案