【问题标题】:Request factory generic method properties请求工厂泛型方法属性
【发布时间】:2024-01-13 10:54:01
【问题描述】:

是否可以在请求方法中使用泛型?或者如果不是如何解决这个问题?

假设我想实现分页。所以在我的请求界面中我有这样的方法:

public List<UserProxy> getUserList(int offset, int limit);

但该列表仅返回有限的数据。对于分页实现,我还需要全部元素。在 RPC 风格中,我会使用 Result 对象:

public MyResultObject<User> getUserList(int offset, int limit)

我将在 MyResultObject 中将 List 和 totalCount 存储为属性。不幸的是,在 RF 中我无法做到这一点。同样在 GWT-RPC 中,我可以在单个请求中使用命令模式并从一种方法中检索列表并从另一种方法中检索总数。

如何同时获取元素列表的总数?

【问题讨论】:

    标签: gwt requestfactory


    【解决方案1】:

    您可以拥有一个 MyResultObjectProxy(诚然专门用于 UserProxy),或者您可以在同一个 HTTP 批处理请求中发出两个请求(列表和总数):

    MyContext ctx = factory.context();
    ctx.getUserList(offset, limit).to(new Receiver<List<UserProxy>>() { … });
    ctx.getUserTotalCount().to(new Receiver<Integer>() { … });
    ctx.fire();
    

    从 GWT 2.4 开始,RF 支持多态性,所以也许您可以使用不专门用于特定实体代理(或值代理)的 MyResultObjectProxy,尽管我真的不确定它是否真的有效。

    【讨论】:

    • 所以你的第一个方法有效,但我必须为我想在分页视图中显示的每个实体编写 MyResultObjectProx。
      我认为第二个是最好的,但是我需要编写两个接收器并将它们同步在一起。事实上,我编写了 ReceiverManager 来做到这一点,但在我看来,它仍然是使用样板代码的尴尬方法。
    • 第三个选项最好写不专门用于特定代理,但它不起作用,因为代理不接受泛型或对象作为列表元素。还有其他想法吗?
    • 回复。第三种选择:即使您只是使用List&lt;EntityProxy&gt;?或者也许让您的所有实体代理扩展相同的基本接口,并使用该接口。当然,您必须添加强制转换,但这仍然是更少的样板代码和更轻量级的编译代码。
    • 它几乎可以工作。我有以下代理:@ProxyFor(value=MyResult.class) public interface MyResultProxy extends ValueProxy{ public List&lt;ValueProxy&gt; getList(); public Integer getTotalCount(); } 但在客户端上我得到了 ValueProxy,但我无法将其转换为 UserProxy。
    • 无论如何感谢您对批处理的提示。可能直到错误code.google.com/p/google-web-toolkit/issues/detail?id=6234 被修复,这是唯一可行的解​​决方案。谢谢托马斯。