代码之家  ›  专栏  ›  技术社区  ›  L.Spillner

GWT无法从servlet检索结果

  •  0
  • L.Spillner  · 技术社区  · 6 年前

    我目前正在为类似于排序框架的东西开发一个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;
    }
    

    SortingFrameworkMPL.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(结果视图的Presenter):

    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() 实际上是返回了一些东西,但不知何故它失败了,上面提到的例外。

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Colin Alworth    6 年前

    Map<String,List<?>> 但我在一个空项目中尝试过,结果很好。

    你的直觉是正确的-GWT不知道 ? 也就是说,所以不准备序列化任何类型,但很可能您正在发送列表中的某个对象,而它不知道如何发送。

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

    价值 signature 是服务器序列化但客户端无法读取的类的名称。事实上,说“不是一个函数”很可能意味着GWT认为你的数据 可序列化,但可能认为只能向其他方向发送- [0] 试图从一组三个函数中读取一个函数-一个用于实例化序列化值,一个用于完成字段的反序列化,一个用于序列化字段以发送到服务器。