GWT 无法从 servlet 检索结果

GWT unable to retrieve result from servlet

我目前正在为类似于排序框架的东西开发一个 GUI(使用 GWT),直到最后一步一切正常。但是由于 JavaScriptException:

我无法检索数据
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: com.google.gwt.core.client.JavaScriptException: (TypeError) : this$static[signature][0] is not a function
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.$instantiate(0.js@35:10985)
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.instantiate_13(0.js@12:10952)
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.deserialize_18(0.js@30:10259)
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.readObject(0.js@15:10126)
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.deserialize_7(0.js@24:9909)
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.deserialize_5(0.js@3:9875)
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.$deserialize(0.js@28:10977)
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.deserialize_19(0.js@5:10936)
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.deserialize_18(0.js@19:10261)
Tue May 29 09:46:56 GMT+200 2018 debug SEVERE: Unknown.readObject(0.js@15:10126)

老实说,我对 javascript 完全一无所知,所以我只是假设在实例化返回对象时出了点问题,但在这种情况下,我使用的是 java.util.Map<String,java.util.List<?>> 并确保我确实使用了java.util 包中的那些。

负责的代码如下:

SortingFramework.java(界面):

@RemoteServiceRelativePath ( "framework")
public interface SortingFramework<T extends Comparable<T>>
    extends RemoteService
{
  public Map<String,List<?>> getResults();
}

SortingFrameworkAsync.java(界面):

public interface SortingFrameworkAsync<T extends Comparable<T>>
{
  void getResults( AsyncCallback<Map<String, List<?>>> result ) throws IllegalArgumentException;
}

SortingFrameworkImpl.java (Servlet):

public class SortingFrameworkImpl<E extends Comparable<E>>
    extends RemoteServiceServlet
    implements SortingFramework<E>
{
 Map<String,List<?>> results = new HashMap<String,List<?>>();     

  @Override
  public Map<String, List<?>> getResults()
  {
    boolean b;
    do
    {
         // will return true when everything is done.
         b = !isDone();
     }
     while ( b );

    return new HashMap<String,List<?>>(results); // also tried to simply return results here
  }
}

在这种情况下,我省略了 results 的填充方式,因为它不是问题的一部分,并且我确保没有值是 null 或来自不同类型。简而言之:地图正是我想要的。

现在调用部分:

ResultPresenterImpl.java(ResultView 的演示者):

public class ResultPresenterImpl
    implements ResultPresenter
{
// gets set at an earlier point than the error occurs
private SortingFrameworkAsync<?> model;

  @Override
  public void initView()
  {
    model.getResults( new AsyncCallback<Map<String,List<?>>>()
    {
      // here the exception gets caught.
      @Override
      public void onFailure( Throwable caught )
      {
        log.severe( caught.toString() );
        for(StackTraceElement element : caught.getStackTrace())
        {
          log.severe( element.toString() );
        }
      }

      @Override
      public void onSuccess( Map<String, List<?>> result )
      {
        addContentToView( result );
      }
    } );
    view.show();
  }
}

initView() 方法只有在用户确认一切必要时才会被调用,远程调用过程应该等待 getResult() 实际返回一些东西但不知何故失败并出现上述异常。

我确保一切都有价值并且 null 不会在任何时候发生。所以我的问题是:远程过程调用怎么会失败?异常原因是什么?

起初我认为 GWT 可能无法 serialize/desieralize 一个 Map<String,List<?>> 但我在一个空项目中尝试了它,结果很好。

At first I thought that GWT might not be able to serialize/desieralize a Map<String,List<?>> but I tried that in an empty project and it worked out just fine.

您的直觉是正确的 - GWT 无法判断 ? 的含义,因此不会为序列化准备任何类型,但您可能会发送该列表中的某些对象,但它不会知道怎么发了。

this$static[signature][0] is not a function

signature的值是class的名称,服务器端序列化了,客户端无法读取。事实上 "is not a function" 可能意味着 gwt 认为您的数据 可序列化的,但可能认为它只能以不同的方向发送 - [0] 是尝试从一组三个函数中读取一个函数 - 一个用于实例化序列化值,一个用于完成反序列化字段,一个用于序列化字段以发送到服务器。