2016-06-01 25 views
0

私はJavaクラスを生成するためにjaxbプラグイン(rg.jvnet.jaxb2.maven2)を使用しています。だから、私は自動的にJavaクラスを生成するxsdを使用しています。私は自分の解決策を抽象的にしたい。抽象クラスの抽象リストのアンマーシャリング

私は

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

その後XMLを持って、私は他の製品の同じXMLを持っているつもりですが、余分なNUMBER要素

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

と私は抽象として私の解決策を作りたいです。以下は私のjaxbの実装です。

1) My Resultsクラスには結果リストが含まれています。私はこの結果を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; 
} 

これはコード

<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の上に生成するために、私のXSDファイルで実装パブリック抽象クラス)これは、結果の子クラスで、子フィールドがあります。

@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; 
    } 

これは、問題は、私が前述したように、私のxmlを作成することはできませんよなコード

<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> 

上に生成するために、私のXSDファイルです。 mu xmlの結果を埋めることができません。

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

これはあなたのXMLでBASERESULT要素を見つけるために期待していることを伝えます:

ここから来

答えて

0

あなたの問題をアドバイスをしてください。

スイッチ:これにより

@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要素名を使用する必要があります。

あなたがそれを行うことができない場合は、あなたが望むように抽象的な解決策を実装できる回避策はありません。