在我的应用程序中,我有许多带有分页的表,因此我创建了一个类来保存分页查询的部分结果列表和结果总数:
@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保留为接口 - 任何更容易更改的接口(可能是第二个))