【问题标题】:GWT RequestFactory, how to implement Query results DTOsGWT RequestFactory,如何实现查询结果 DTO
【发布时间】:2025-12-06 13:25:02
【问题描述】:

我有一个大型的 GWT-RPC 实现,实际上我正在评估转移到 RequestFactory 的替代方案。 我这样做的基本原因是因为我对 GWT-RPC 产生的 TypeSerializers 解决方案以及为序列化/反序列化生成的大量代码在我的情况下实际上占了整体的 60% 以上并不十分满意JS 生成的代码。

所以一周以来我一直在阅读有关 requestFactory 的所有内容,我的第一印象是 API 仅限于持久实体的管理,但它并没有清楚地显示 API 将如何支持查询结果代理。

我读到它可以通过使用 ValueProxy 来完成,但我找不到任何这样做的好例子。 我的意思是假设我需要提供上个月前 10 名客户的销售排名。 像这样的信息很容易通过 RPC 提供,但对于 RequestFactory 我不确定。 我没有要代理的域对象。

通过 GWT-RPC,我将拥有如下服务方法:

List<ClientRankingDTO> getClientRanking(String clientCode, Date fromDate, Date untilDate);

我的 ClientRankingDTO 将如下所示:

public class ClientRankingDTO implements Serializable {

    private String clientCode;
    private String clientDescription;
    private Integer rankingPosition;
    private BigDecimal amount;
    // Getters and setters are hidden for simplicity
}

所以在我的 DAO 层,我将在 SalesStatistics 域模型实体上使用一些方法来计算相应的排名,并生成具有相应结果的 ClientRankingDTO 列表。

这可以通过一个简单的查询来完成,例如:

Select top 10 client_code, sum(amount) from sales_stats A 
       where A.sales_date>=fromDate 
         and A.sales_date<=untilDate 
group by client_code
order by amount desc

使用您选择的 ORM 实现。

我的问题是如何使用 RequestFactory 实现这种服务?

【问题讨论】:

    标签: gwt gwt-rpc requestfactory


    【解决方案1】:

    只需使用ValueProxy而不是EntityProxy,就可以将RequestFactory变成一个“简单的RPC”机制,类似于GWT-RPC。

    代理:

    @ProxyFor(ClientRankingDTO.class)
    interface ClientRankingProxy extends ValueProxy {
      // getters for the properties, no need for setters if it's only server-to-client
    }
    

    然后,在RequestContext(客户端):

    Request<ClientRankingProxy> getClientRanking(String clientCode, Date fromDate, Date untilDate);
    

    在服务端的服务中:

    public ClientRankingDTO getClientRanking(String clientCode, Date fromDate, Date untilDate) {
      // your request to the database, mapping the result to ClientRankingDTO
    }
    

    【讨论】: