Msgstr "RequestCycle в данный момент не установлен!" Исключение при использовании интеграции IcePush Wicket и попытке вызвать "push()" из другого класса

Хорошо здесь идет. Это мое первое приложение для калитки, и я пытаюсь интегрировать icepush на примере push-панели.

То, что я пытаюсь сделать, это отправить обновление на панель, вызвав метод updatePanel(String content) из другого класса.

Вот код

В моей расширенной PushPanel у меня есть:

public AsyncCommsPanel(String id) {
    super(id);
    this.setOutputMarkupId(true);

    ajaxForm = new Form("ajaxForm");
    ajaxForm.setOutputMarkupId(true);

    ajaxForm.add(textStore = new Label("textStore",""));

    ajaxForm.add(new AjaxButton("updateButton") {
        @Override
        protected void onSubmit(AjaxRequestTarget target, Form form) {
            System.out.println("Update button pressed!");
            /* CODE TO PULL NEW DATA FROM ELSEWHERE */
            /* UPDATE TAKES TIME SO HAS ITS OWN CALLBACK */
        }

        @Override
        protected void onError(AjaxRequestTarget target, Form<?> form) {
            System.out.println("Update button error.");
        }
    });
    add(ajaxForm);
}

@Override
protected void pushCallback(AjaxRequestTarget target) {
    target.add(ajaxForm);
}

public void updatePanel(String updateString) {
    /* THIS METHOD SHOULD ALLOW THE PANEL TO BE UPDATED FROM ELSEWHERE */
    if (textStore != null) ajaxForm.remove(textStore);
    ajaxForm.add(textStore = new Label("textStore", updateString));
    push();
}

Когда я пытаюсь вызвать метод updatePanel из метода обратного вызова сборщика данных, я получаю следующее исключение:

ERROR (SelectorManager.run):  org.apache.wicket.WicketRuntimeException: No RequestCycle is currently set!
at org.apache.wicket.Component.getRequest(Component.java:1831)
at org.apache.wicket.markup.html.WebPage.dirty(WebPage.java:315)
at org.apache.wicket.Page.dirty(Page.java:288)
at org.apache.wicket.Page.componentRemoved(Page.java:948)
at org.apache.wicket.MarkupContainer.removedComponent(MarkupContainer.java:1422)
at org.apache.wicket.MarkupContainer.remove(MarkupContainer.java:612)
at uk.ac.warwick.collabtex.AsyncCommsPanel.updatePanel(AsyncCommsPanel.java:107)
at uk.ac.warwick.collabtex.Editor$1.updateSuccess(Editor.java:98)

1 ответ

Решение

Добро пожаловать в асинхронный мир:-) ThreadLocals (Application, Session и ThreadLocal) доступны только во время обработки потока HTTP-запроса (он же рабочий поток). Таким образом, есть две проблемы: 1) при запуске собственного потока вы теряете ThreadLocal, 2) даже если вы экспортируете их, есть вероятность, что ответ будет уже закрыт по окончании вашей работы. Я не уверен, как работает IcePush, но вот что я считаю лучшим вариантом - отправьте задачу, сохраните ссылку на нее в приложении (например, на карте), а затем запустите поведение таймера ajax, которое запрашивает futureTask.isDone () периодически, и когда он возвращает true, меняются необходимые вам иерархии (я вижу вызов MarkupContainer # remove () в трассировке стека).

Другие вопросы по тегам