GWT 无法从 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包中的那些。

负责的代码如下所示:

排序框架.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 (Presenter for a 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 可能无法序列化/取消Map<String,List<?>>但我在一个空项目中尝试过,效果很好。

起初我认为 GWT 可能无法序列化/取消Map<String,List<?>>但我在一个空项目中尝试过,效果很好。

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

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

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

最新更新