0

我正在使用 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 中填充结果。

请指教

4

1 回答 1

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 的每个类使用不同的元素名称。

如果您不能这样做,我看不到任何解决方法可以让您按照自己的意愿实施抽象解决方案。

于 2016-06-13T19:53:12.403 回答