【问题标题】:Creating abstract generic jaxb class创建抽象的通用 jaxb 类
【发布时间】:2012-11-06 05:00:27
【问题描述】:

我有以下采用泛型 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;
    }

}

我需要删除对 NameSearchResults @XmlElement(type=NameSearchResults.class) 的引用以使基础实际上是通用的,但如果我这样做了,我会收到错误。

错误

[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&lt;E&gt; extends SearchResponseBase&lt;E&gt; 的格式工作,并将其用作泛型类型。

如果我按照保罗的建议去做,我可以上课:

@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 从这个 &lt;E extends NameSearchResults&gt; 中推出?

【问题讨论】:

    标签: java generics jaxb annotations


    【解决方案1】:

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

    【讨论】:

    • 同样在这一点上,我将扩展和基合并为一个类,并使其不再是接口而不是抽象类。
    • 为我节省了很多寻找解决方案的工作。谢谢!完美运行
    【解决方案2】:

    我对 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;
        }
    
        ...
    }
    

    【讨论】:

    • 感谢保罗,这确实可以使基础抽象,但它只是将对 NameSearchResults 的引用推送到扩展基础的类中。我想要的是完全从课程中删除它。
    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多