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 がバインディングに適切なクラスを見つけるために、1 つのクラスによってのみ記述されるべきです。

したがって、BaseResult を拡張するクラスごとに、XML で異なる要素名を使用する必要があります。

それができない場合、希望どおりに抽象的なソリューションを実装できる回避策はありません。

于 2016-06-13T19:53:12.403 に答える