GWT无法从servlet检索结果

时间:2018-05-29 08:20:05

标签: java gwt instance

我目前正在开发一个类似于排序框架的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<?>>并确保我真的使用{{1}中的那些包裹。

负责的代码如下:

SortingFramework.java(接口):

java.util

SortingFrameworkAsync.java(接口):

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

SortingFrameworkImpl.java(Servlet):

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

在这种情况下,我省略了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或来自不同的类型。简而言之:地图完全符合我的要求。

现在是调用部分:

ResultPresenterImpl.java(ResultView的Presenter):

null

只有当用户确认所有必要的内容并且远程调用过程应该等待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()方法,但不知怎的,它会因上述异常而失败。

我确保一切都有一个vallue,getResult()在任何时候都不会发生。所以我的问题是:远程过程调用如何失败?异常的原因是什么?

起初我认为GWT可能无法序列化/去标记null,但我在一个空项目中尝试了它并且它运行得很好。

1 个答案:

答案 0 :(得分:1)

  

起初我认为GWT可能无法序列化/去标记Map<String,List<?>>,但我在一个空项目中尝试了它并且它运行得很好。

你的直觉在这里是正确的 - GWT无法分辨?的意思,所以不准备任何类型的序列化,但你可能在该列表中发送一些对象而且它不知道如何发送它。

  

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

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