ジェネリック型 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>
ますか?