我目前正在为类似于排序框架的东西开发一个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
{
b = !isDone();
}
while ( b );
return new HashMap<String,List<?>>(results);
}
}
在这种情况下,我忽略了
results
是填充的,因为它不是问题的一部分,并且我确保没有值
null
或者是其他类型的。简而言之:地图正是我想要的。
现在呼叫部分:
ResultPresenterImpl.java(结果视图的Presenter):
public class ResultPresenterImpl
implements ResultPresenter
{
private SortingFrameworkAsync<?> model;
@Override
public void initView()
{
model.getResults( new AsyncCallback<Map<String,List<?>>>()
{
@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<?>>
但我在一个空项目中尝试过,结果很好。