Creating an abstract jaxb generic class

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

0
source share
2 answers

Thanks to @PaulBellora for reference, the base and extended classes will become abstract, and then the name will be implanted, for example:

Base

 @XmlRootElement(name = "searchResponseBase") public abstract class SearchResponseBase<E>{ public abstract E getSearchResults(); public abstract void setSearchResults(E mSearchResults); } 

Extended base

 @XmlRootElement(name = "searchResponse") public abstract class SearchResponse<E> extends SearchResponseBase<E>{ public abstract SearchRequest getSearchRequest(); public abstract void setSearchRequest(SearchRequest value); } 

Name implication

 @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; } } 
+3
source

I am not familiar with JAXB, but you can try the abstract methods getSearchResults and setSearchResults and only implement them when E was allowed. For instance:

 //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; } ... } 
+1
source

Source: https://habr.com/ru/post/1488642/


All Articles