0

ジェネリック型 E を取る次の単純な jaxB クラスがあります

@XmlAccessorType(XmlAccessType.FIELD)
@XmlTransient
@XmlRootElement(name = "searchResponseBase")
public abstract class SearchResponseBase<E>{

    @XmlElement(type=NameSearchResults.class)
    protected E searchResults;

    public E getSearchResults()
    {
        return searchResults;
    }

    public void setSearchResults(E mSearchResults)
    {
        this.searchResults = mSearchResults;
    }

}

@XmlElement(type=NameSearchResults.class)ベースを実際に汎用的にするには、NameSearchResults への参照を削除する必要がありますが、そうするとエラーが発生します。

エラー

[com.sun.istack.internal.SAXException2: class au.test.nameSearch.NameSearchResults nor any of its super class is known to this context.
javax.xml.bind.JAXBException: class au.test.nameSearch.NameSearchResults nor any of its super class is known to this context.]


これはそれを拡張するクラスの例です

拡張クラス

@SuppressWarnings("javadoc")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {
    "searchRequest",
    "searchResults"
})
@XmlRootElement(name = "searchResponse")
public class SearchResponse extends SearchResponseBase<NameSearchResults> {

    @XmlElement(required = true)
    protected SearchRequest searchRequest;

    public SearchRequest getSearchRequest() {
        return searchRequest;
    }

    public void setSearchRequest(SearchRequest value) {
        this.searchRequest = value;
    }
}

基本クラスを実際にジェネリックにするにはどうすればよいですか?

できれば、拡張クラスをその形式SearchResponse<E> extends SearchResponseBase<E>で機能させ、それをジェネリック型としても使用したいと考えています。

ポールが提案したようにすれば、クラスを次のように取得できます。

@XmlRootElement(name = "searchResponse")
public class SearchResponse<E extends NameSearchResults> extends SearchResponseBase<E> {

    @XmlElement(required = true)
    protected SearchRequest searchRequest;

    protected E searchResults;

    public SearchRequest getSearchRequest() {
        return searchRequest;
    }

    public void setSearchRequest(SearchRequest value) {
        this.searchRequest = value;
    }

    @Override
    public E getSearchResults() {
        return searchResults;
    }

    @Override
    public void setSearchResults(E mSearchResults) {
        this.searchResults = mSearchResults;
    }  
}

これから NameSearchResults をプッシュする方法はあり<E extends NameSearchResults>ますか?

4

2 に答える 2

3

@PaulBellora の助けに感謝します。基本クラスと拡張クラスの両方が抽象化され、次のように名前が実装されます。

ベース

@XmlRootElement(name = "searchResponseBase")
public abstract class SearchResponseBase<E>{

    public abstract E getSearchResults();

    public abstract void setSearchResults(E mSearchResults);

}

拡張ベース

@XmlRootElement(name = "searchResponse")
public abstract class SearchResponse<E> extends SearchResponseBase<E>{

    public abstract SearchRequest getSearchRequest();

    public abstract void setSearchRequest(SearchRequest value);   
}

名前の実装

@XmlRootElement(name = "nameSearchResponse")
public class NameSearchResponse extends SearchResponse<NameSearchResults>{

    @XmlElement(required = true)
    protected SearchRequest searchRequest;

    protected NameSearchResults searchResults;

    @Override
    public NameSearchResults getSearchResults() {
        return searchResults;
    }

    @Override
    public void setSearchResults(NameSearchResults mSearchResults) {
        this.searchResults = mSearchResults;
    }

    @Override
    public SearchRequest getSearchRequest() {
        return searchRequest;
    }

    @Override
    public void setSearchRequest(SearchRequest value) {
        this.searchRequest = value;
    }
}
于 2012-11-06T23:24:47.420 に答える
1

私はJAXBに慣れていませんが、メソッドの作成getSearchResultssetSearchResults抽象化を試して、E解決されたときにのみそれらを実装することができます。例えば:

//annotations ommitted
public abstract class SearchResponseBase<E>{

    public abstract E getSearchResults();

    public abstract void setSearchResults(E mSearchResults);
}

//annotations ommitted
public class SearchResponse extends SearchResponseBase<NameSearchResults> {

    @XmlElement(type=NameSearchResults.class)
    protected NameSearchResults searchResults;

    @Override
    public final NameSearchResults getSearchResults() {
        return searchResults;
    }

    @Override
    public final void setSearchResults(NameSearchResults mSearchResults) {
        this.searchResults = mSearchResults;
    }

    ...
}
于 2012-11-06T05:22:52.890 に答える