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&lt;String&gt;

【讨论】:

【参考方案2】:

如果服务接口是这样的:

public interface ShowBoxCommandService extends RemoteService 
  public ArrayList<String> showBox();

那么你必须有一个关联的异步接口:

public interface ShowBoxCommandServiceAsync 
  public void showBox(AsyncCallback<ArrayList<String>> callback);

这意味着您应该传递给showBox 的回调类型是AsyncCallback&lt;ArrayList&lt;String&gt;&gt;

new AsyncCallback<ArrayList<String>>() 

  @Override
  public void onSuccess(ArrayList<String> list) 
    // ...
  

  @Override
  public void onFailure(Throwable caught) 
    // ...
  

【讨论】:

@lonut 在使用上述情况调用显示框方法时,我在 IDE 中收到一个错误,要求我将异步接口的返回类型更改为 ArrayList,我记得读过异步交互的返回类型应该是 void @Bhavya PH,你能用异步接口的源代码更新问题吗?如果返回类型为 void,IDE 不应抱怨。顺便问一下,什么IDE? Eclipse 与谷歌的插件? @lonut 非常感谢您的 cmets 我已经用代码更新了问题 @Bhavya PH,我不知道。一切看起来都很好。可能是 IDE 的问题。【参考方案3】:

您的回调不应为 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【参考方案4】:

嗯?您的方法返回一个 ArrayList 并且您在调用中声明 void?

Change <Void> to <ArrayList<String>>

【讨论】:

如果我不使用 void,则 aync 调用的返回类型会从 void 更改为 ArrayList,这不应该是这种情况,有什么线索吗? 坦率地说,我不明白你在说什么。如果你想要 String 列表,返回它,如果你想返回 void,不要返回任何东西。

以上是关于GWT RPC 机制如何使用非 void 返回类型的主要内容,如果未能解决你的问题,请参考以下文章

rpc与gwt一起使用时如何将参数类型设置为inout?

使用 GWT 内置的 RPC 序列化/反序列化机制

RPC 的 GWT Servlet 模型是单线程模型,还是如何通过 GWT 实现高可用性?

GWT RPC 机制的时序图

Google Web Toolkit (GWT) EventBus 事件触发/处理

GWT RPC 是如何工作的? (网址集)