将泛型类转换为 Java Web 服务的 XML 模式



在我的应用程序中,我有许多带有分页的表,因此我创建了一个类来保存分页查询的部分结果列表和结果总数:

@XmlRootElement(name = "paginatedList")
public class PaginatedList<T> implements Serializable {
    private List<T> results;
    private Integer totalSize;
    @XmlElement(name = "result")
    public List<T> getResults() {
        return this.results;
    }
    @XmlElement(name = "totalSize")
    public int getTotalSize() {
        return totalSize;
    }
    // Setters, constructors, etc.
}

然后,我将以下方法公开给 EJB:

PaginatedList<EmployeeType> getPaginatedList();

此外,我还使用 Web 服务公开此方法。但是为 Web 服务响应生成的 XSD 会丢失类型信息 ( EmployeeType):

<xs:complexType name="getPaginatedListResponse">
    <xs:sequence>
       <xs:element name="return" type="tns:paginatedList" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="paginatedList">
    <xs:sequence>
       <xs:element name="result" type="xs:anyType" minOccurs="0" maxOccurs="unbounded"/>
       <xs:element name="totalSize" type="xs:int"/>
    </xs:sequence>
</xs:complexType>

我知道这可能是由于类型擦除而发生的,但是如果我只返回如下列表:

List<EmployeeType> getList();

我得到了一个更好的XSD:

<xs:complexType name="getListResponse">
    <xs:sequence>
        <xs:element name="return" type="tns:employeeType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="employeeType">
    <xs:sequence>
        <xs:element name="id" type="xs:int" minOccurs="0"/>
        <xs:element name="name" type="xs:string" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

所以问题是:为了不丢失 Web 服务响应中的类型信息,我应该怎么做?我应该做什么JAXB魔法来"模拟"List的XSD生成吗?欢迎任何建议。

如果有任何区别,我正在使用Weblogic 10.3来部署我的项目。

只是一个疯狂的猜测 - 对接口进行PaginatedList会有所不同吗?

因此,创建一个具有IPaginatedList<EmployeeType> getPaginatedList();并具有public class PaginatedList<T> implements Serializable, IPaginatedList IPaginatedList<T>接口(或将类重命名为PaginatedListImpl<T> implements Serializable, IPaginatedList并将PaginatedList保留为接口 - 任何更容易更改的接口(可能是第二个))

最新更新