I have the following simple jaxB class that accepts a generic type E
@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; } }
I need to remove the link to NameSearchResults @XmlElement(type=NameSearchResults.class) in order to make the database actually shared, but if I do, I will get an error.
Error
[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.]
This is an example of a class that extends it.
extended class
@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; } }
How to make a base class truly common?
it is advisable that my extended class work in the format SearchResponse<E> extends SearchResponseBase<E> and use it as a generic type.
If I do as Paul suggested, I can get a class:
@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; } }
Is there any way I can call NameSearchResults from this <E extends NameSearchResults> ?
source share