GWT RPC 机制如何使用非 void 返回类型
Posted
技术标签:
【中文标题】GWT RPC 机制如何使用非 void 返回类型【英文标题】:GWT RPC mechanism how to use non void return type 【发布时间】:2011-08-31 07:13:11 【问题描述】:我有一个场景,我需要为 Synchrnous 函数指定一个返回类型,代码如下:
@RemoteServiceRelativePath("show_box")
public interface ShowBoxCommandService extends RemoteService
public ArrayList<String> showBox();
方法在服务端的实现是:
public ArrayList<String> showBox()
ArrayList<String> box = new ArrayList<String>();
Iterator<Box> boxes = BoxRegistry.getInstance().getBoxes();
while (boxes.hasNext())
box.add(boxes.next().toString());
return box;
我正在尝试在客户端以以下格式定义回调变量,以便调用该方法
AsyncCallback<Void> callback = new AsyncCallback<Void>()
public void onFailure(Throwable caught)
// TODO: Do something with errors.
// console was not started properly
@Override
public void onSuccess(Void result)
// TODO Auto-generated method stub
// dialog saying that the console is started succesfully
;
使用 aync 接口代码更新:
public interface ShowBoxCommandServiceAsync
void showBox(AsyncCallback<ArrayList<String>> callback);
但这会导致 Async 方法中的方法定义发生变化。
任何想法或线索都会有所帮助。
谢谢, 八卦
附:如有重复请见谅
【问题讨论】:
【参考方案1】:回调应该是:
AsyncCallback<ArrayList<String>> callback = new AsyncCallback<ArrayList<String>>()
public void onFailure(Throwable caught)
// TODO: Do something with errors.
// console was not started properly
@Override
public void onSuccess(ArrayList<String> result)
// TODO Auto-generated method stub
// dialog saying that the console is started succesfully
;
如果您不需要使用结果,那么您可以忽略它,但如果是这种情况,您可能应该质疑您的设计以及为什么首先需要该方法返回 ArrayList<String>
。
【讨论】:
【参考方案2】:如果服务接口是这样的:
public interface ShowBoxCommandService extends RemoteService
public ArrayList<String> showBox();
那么你必须有一个关联的异步接口:
public interface ShowBoxCommandServiceAsync
public void showBox(AsyncCallback<ArrayList<String>> callback);
这意味着您应该传递给showBox
的回调类型是AsyncCallback<ArrayList<String>>
。
new AsyncCallback<ArrayList<String>>()
@Override
public void onSuccess(ArrayList<String> list)
// ...
@Override
public void onFailure(Throwable caught)
// ...
【讨论】:
@lonut 在使用上述情况调用显示框方法时,我在 IDE 中收到一个错误,要求我将异步接口的返回类型更改为 ArrayList您的回调不应为 Void。如果您的同步方法返回一个字符串列表,则异步回调方法应该接收该列表。您必须使用 ArrayList,因为该类需要实现 Serializable 接口。
AsyncCallback<ArrayList<String>> callback = new AsyncCallback<ArrayList<String>>()
public void onFailure(Throwable caught)
// TODO: Do something with errors.
// console was not started properly
@Override
public void onSuccess(ArrayList<String> result)
// TODO Auto-generated method stub
// dialog saying that the console is started succesfully
;
【讨论】:
该方法将返回一个 ArrayList嗯?您的方法返回一个 ArrayList 并且您在调用中声明 void?
Change <Void> to <ArrayList<String>>
【讨论】:
如果我不使用 void,则 aync 调用的返回类型会从 void 更改为 ArrayList,这不应该是这种情况,有什么线索吗? 坦率地说,我不明白你在说什么。如果你想要 String 列表,返回它,如果你想返回 void,不要返回任何东西。以上是关于GWT RPC 机制如何使用非 void 返回类型的主要内容,如果未能解决你的问题,请参考以下文章
RPC 的 GWT Servlet 模型是单线程模型,还是如何通过 GWT 实现高可用性?