Jaxb在抽象类中解组抽象列表

时间:2016-06-01 15:43:39

标签: java xsd jaxb maven-jaxb2-plugin jaxb2-maven-plugin

我正在使用jaxb插件(rg.jvnet.jaxb2.maven2)来生成我的java类。所以,我正在使用自动生成java类的xsd。我希望我的解决方案是抽象的。

我有一个XML

  <RESULTS>
    <RESULT>
      <TOKEN>XXXXXXXXXXXXXXXXXXXXXXXXX</TOKEN>
      <LANGUAGE>en</LANGUAGE>
      <SEARCHTYPE>PO</SEARCHTYPE>
    </RESULT>
  </RESULTS>

稍后,我将为其他产品提供相同的XML,但需要额外的NUMBER元素

 <RESULTS>
    <RESULT>
      <TOKEN>XXXXXXXXXXXXXXXXXXXXXXXXX</TOKEN>
      <LANGUAGE>en</LANGUAGE>
      <SEARCHTYPE>PO</SEARCHTYPE>
      <NUMBER>123456789</NUMBER>
    </RESULT>
  </RESULTS>

我想让我的解决方案变得抽象。下面是我的jaxb实现。

1)我的结果类包含结果列表。我把这个结果作为BaseResult。

   @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "RESULTS", propOrder = {
        "baseresult"
    })
    public class Results implements Equals2, HashCode2, ToString2
    {

        @XmlElement(name = "BASERESULT", required = true)
        protected List<BaseResult> baseresult;
    }

2)这是我的BaseResult类,它有公共字段。

公共抽象类BaseResult实现了Equals2,HashCode2,ToString2     {

    @XmlElement(name = "TOKEN", required = true)
    protected String token;
    @XmlElement(name = "LANGUAGE", required = true)
    protected String language;
}

这是我生成上面代码的xsd文件

   <xs:complexType name="RESULTS">
            <xs:annotation>
                <xs:documentation>
                    Holds results tag <!-- <RESULTS></RESULTS> -->
                </xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="BASERESULT" type="BASERESULT" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>

<xs:complexType name="BASERESULT" abstract="true">
        <xs:annotation>
            <xs:documentation>
                Holds result <!-- <RESULT></RESULT> -->token , with all common elements in result tag
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="TOKEN" type="xs:string" />
            <xs:element ref="LANGUAGE" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

3)这是结果的子类,它有子字段。

  @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "RESULT", propOrder = {
        "searchType"
    })
    public class Result extends BaseResult
        implements Equals2, HashCode2, ToString2
    {

        @XmlElement(name = "SEARCHTYPE", required = true)
        @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
        @XmlSchemaType(name = "NCName")
        protected String searchType;
    }

这是我生成上面代码的xsd文件

<xs:complexType name="RESULT">
        <xs:complexContent>
            <xs:extension base="BASERESULT">
                <xs:sequence>
                    <xs:element ref="SEARCHTYPE" type="xs:string"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

问题是我无法按上述方式制作我的xml。 它无法填充mu xml中的结果。

PLease建议

1 个答案:

答案 0 :(得分:0)

你的问题来自:

@XmlElement(name = "BASERESULT", required = true)
protected List<BaseResult> baseresult;

这表明您希望在XML中找到BASERESULT元素。

切换到:

@XmlElement(name="result")
protected List<BaseResult> baseresult;

有了这个,你只会获得你的公共属性(或者因为BaseResult是抽象的错误)。

你的另一个问题是你有映射到哪个类JAXB应该绑定它找到的元素。

你应该使用的是这样的东西:

@XmlElements({
    @XmlElement(name="result",type=Result.class),
    @XmlElement(name="result2",type=Result2.class)
})
protected List<BaseResult> baseresult;

问题是你为你的班级使用相同的元素名称。 通常,XML元素只能由一个类描述,以便JAXB找到适当的绑定类。

因此,您应该在XML中为扩展BaseResult的每个类使用不同的元素名称。

如果你不能这样做,我没有看到任何可以根据你的意愿实现抽象解决方案的解决方法。