【问题标题】:Transformation of generic classes to XML Schema for Java web services将泛型类转换为 Java Web 服务的 XML 模式
【发布时间】:2012-11-14 13:36:04
【问题描述】:

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

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

所以问题是这样的:我应该怎么做才能不丢失我的网络服务响应中的类型信息?为了“模拟” List 的 XSD 生成,我应该做任何 JAXB 魔术吗?欢迎任何建议。

如果有什么不同,我将使用 Weblogic 10.3 来部署我的项目。

【问题讨论】:

    标签: java web-services jaxb jax-ws


    【解决方案1】:

    只是一个疯狂的猜测 - 将 PaginatedList 设置为界面会有所不同吗?

    所以让接口IPaginatedList&lt;T&gt; 具有IPaginatedList&lt;EmployeeType&gt; getPaginatedList();public class PaginatedList&lt;T&gt; implements Serializable, IPaginatedList(或将您的类重命名为PaginatedListImpl&lt;T&gt; implements Serializable, IPaginatedList 并将 PaginatedList 保留为接口 - 任何更容易更改的东西(可能是第二个))

    【讨论】:

    • 抱歉回复晚了。不,它没有任何区别。如果我将 IPaginatedList&lt;EmployeeType&gt; getPaginatedList() 方法暴露给 Web 服务,我会收到 JAXB 无法处理接口的错误。如果我使用此页面中的说明:jaxb.java.net/guide/Mapping_interfaces.html,我不再收到错误消息,但为分页列表生成的 xsd 包含type="xs:anyType" 属性。
    • 也许然后有 PaginatedList&lt;T&gt; 扩展 AbstractList&lt;E&gt; 所以基本上你的 PaginatedList 只是一个列表 - 并且有 List&lt;EmployeeType&gt; getPaginatedList();
    • 这样我失去了totalSize参数:-(。即使我把它改成PaginatedList&lt;EmployeeType&gt; getPaginatedList();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多