В настоящее время я разрабатываю графический интерфейс (с 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 (Interface):
@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 (сервлет):
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 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()
фактического возврата чего-либо, но каким-то образом происходит сбой с исключением, упомянутым выше.
Iубедился, что все имеет значение и null
не происходит в любой момент.Итак, мой вопрос: как сбой удаленного вызова процедуры?В чем причина исключения?
Сначала я подумал, что GWT, возможно, не сможет сериализовать / десериализовать Map<String,List<?>>
, но я попробовал это в пустом проекте, и это сработало очень хорошо.