Странная необученная ошибка с GWT, UmbrellaException - PullRequest
0 голосов
/ 30 октября 2019

Я строю проект через GWT и Eclipse для реализации сайта, похожего на Yahoo Answer, пока несколько дней назад он не работал идеально, но со вчерашнего дня я заметил ошибку, которую раньше не видел, и это оченьстранно потому что я бы заметил. В основном на консоли Google Chrome я получаю ошибку Uncaught, когда пытаюсь визуализировать ответы, связанные с вопросом, похоже, что база данных (mapdb 1.0.9) ничего не возвращает

Для проблем совместимости яЯ использую Eclipse Mars для Java 7 (1.7) и GWT 2.8.0. Я опубликую часть кода, которая не воспроизводится, нажав на вопрос

  public class MostraRisposte {

private VerticalPanel verticalPanel = null;


public MostraRisposte(VerticalPanel verticalPanel) {
    this.verticalPanel = verticalPanel;
}

public void onModuleLoad(Domanda currentSelection) {

    this.verticalPanel.add(new HTML("<br>"));
    this.verticalPanel.add(new HTML("<br>"));
    final Grid answerGridPanel = new Grid(8, 2);
    answerGridPanel.setWidget(0, 0, new Label("Utente: "));
    answerGridPanel.setWidget(0, 1, new Label(currentSelection.getUserName()));
    answerGridPanel.setWidget(1, 0, new Label("Testo:  "));
    answerGridPanel.setWidget(1, 1, new Label(currentSelection.getText()));
    answerGridPanel.setWidget(2, 0, new Label("Data: "));
    answerGridPanel.setWidget(2, 1, new Label(currentSelection.getDay()));
    answerGridPanel.setWidget(4, 0, new Label("Link1: "));
    answerGridPanel.setWidget(4, 1, new Label(currentSelection.getLinkList().get(0)));
    answerGridPanel.setWidget(5, 0, new Label("Link2: "));
    answerGridPanel.setWidget(5, 1, new Label(currentSelection.getLinkList().get(1)));
    answerGridPanel.setWidget(6, 0, new Label("Link3: "));
    answerGridPanel.setWidget(6, 1, new Label(currentSelection.getLinkList().get(2)));
    answerGridPanel.setWidget(7, 0, new Label("Link4: "));
    answerGridPanel.setWidget(7, 1, new Label(currentSelection.getLinkList().get(3)));
    this.verticalPanel.add(answerGridPanel);
    final GwaServiceAsync gwanswer = GWT.create(GwaService.class);
    final int id = currentSelection.getIdQuestion();
    gwanswer.ordinaRisposte(id, new AsyncCallback<List<Risposta>>() {

        @Override
        public void onFailure(Throwable caught) {
            PopupPanel popup = new PopupPanel(true);
            popup.setWidget(new HTML("<font color='red'>Errore</font>"));
            popup.center();
        }

        @Override
        public void onSuccess(List<Risposta> response) {
            final CellTable<Risposta> questionsTable = new CellTable<>(20);
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getText();
                }
            }, "Risposta");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta answer) {
                    return answer.getUserName();
                }
            }, "Utente");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getDay();
                }
            }, "Giorno");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getTime();
                }
            }, "Ora");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getJudgeEmail();
                }
            }, "Giudice");
            final TextColumn<Risposta> ratingTextColumn = new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getRating();
                }
            };
            questionsTable.addColumn(ratingTextColumn, "Voto");
            ratingTextColumn.setSortable(true);
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getLinkList().get(0);
                }
            }, "Link");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getLinkList().get(1);
                }
            }, "Link");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getLinkList().get(2);
                }
            }, "Link");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getLinkList().get(3);
                }
            }, "Link");
            final ListDataProvider<Risposta> dataProvider = new ListDataProvider<>();
            dataProvider.addDataDisplay(questionsTable);
            final List<Risposta> list = dataProvider.getList();
            for (Iterator<Risposta> iterator = response.iterator(); iterator.hasNext();) {
                final Risposta risposta = iterator.next();
                list.add(risposta);
            }
            final ListHandler<Risposta> columnSortHandler = new ListHandler<>(list);
            columnSortHandler.setComparator(ratingTextColumn, new Comparator<Risposta>() {
                @Override
                public int compare(Risposta option1, Risposta option2) {
                    if (option1.getRating().equals(option2.getRating())) {
                        if (!option1.getDate().after(option2.getDate())) {
                            return -1;
                        } else {
                            return 1;
                        }
                    } else {
                        return (option2 != null && option1 != null) ? option1.getRating().compareTo(option2.getRating())
                                : 1;
                    }
                }
            });
            questionsTable.addColumnSortHandler(columnSortHandler);
            questionsTable.getColumnSortList().push(ratingTextColumn);
            questionsTable.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
            final SingleSelectionModel<Risposta> selectionModel = new SingleSelectionModel<>();
            questionsTable.setSelectionModel(selectionModel);
            selectionModel.addSelectionChangeHandler(new Handler() {
                @Override
                public void onSelectionChange(SelectionChangeEvent event) {
                    if (UtenteAttuale.accountType == 1) {
                        final Risposta currentSelection1 = selectionModel.getSelectedObject();
                        if (currentSelection1 != null) {
                            final AggiungiVoto iv = new AggiungiVoto(MostraRisposte.this.verticalPanel);
                            iv.onModuleLoad(currentSelection1);
                        }
                    }
                }
            });
            questionsTable.setRowCount(response.size(), true);
            questionsTable.setRowData(0, response);
            MostraRisposte.this.verticalPanel.add(questionsTable);
        }
    });
}

}

Iожидать отображения сетки (Grid) с информацией о том, кто сделал выбранный мной вопрос (CurrentSelection), и сразу под таблицей, содержащей ответы, я проверил, а вопросы и ответы правильно введены в базу данных, но, к сожалению, только ответы не дают

Ошибка на консоли Chrome: enter image description here

1 Ответ

0 голосов
/ 30 октября 2019

Попытайтесь перехватить все необработанные исключения и разверните зонт.

Где-то в начале вашего метода onModuleLoad

GWT.setUncaughtExceptionHandler(e -> showError(e));

А в showError сделайте что-то вроде

Throwable unwrapped = unwrap(e); 
GWT.log("Uncaught exception catched", unwrapped);


/**
 * Unwrap the given exception.
 * @param e The exception.
 * @return Unwrapped version of the exception
 */
private static Throwable unwrap(Throwable e)
{
   if (e instanceof UmbrellaException)
   {
      UmbrellaException ue = (UmbrellaException) e;
      if (ue.getCauses().size() == 1)
      {
         return unwrap(ue.getCauses().iterator().next());
      }
   }
   return e;
}

Таким образом, у вас есть намного более чистая трассировка стека, чтобы увидеть, что произошло.

...