GWT не может получить результат от сервлета - PullRequest
0 голосов
/ 29 мая 2018

В настоящее время я разрабатываю графический интерфейс (с 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<?>>, но я попробовал это в пустом проекте, и это сработало очень хорошо.

1 Ответ

0 голосов
/ 29 мая 2018

Сначала я подумал, что GWT, возможно, не сможет сериализовать / десериализовать Map<String,List<?>>, но я попробовал это в пустом проекте, и это сработало очень хорошо.

Ваш инстинктздесь правильно - GWT не может сказать, что означает ?, поэтому не подготавливает какие-либо типы для сериализации, но есть вероятность, что вы отправляете какой-то объект в этом списке, и он не знает, как его отправить.

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

Значение signature - это имя класса, который был сериализован сервером, но не может быть прочитан клиентом.Тот факт, что «не является функцией», вероятно, означает, что gwt считает, что ваши данные могут быть сериализуемыми, но может подумать, что они могут быть отправлены только в другом направлении - [0] пытается прочитать функциюиз набора трех функций - одна для создания экземпляра сериализованного значения, одна для завершения десериализации полей и одна для сериализации полей для отправки на сервер.

...