Msgstr "RequestCycle в данный момент не установлен!" исключение при использовании интеграции калитки icepush и попытке вызвать push () из другого класса - PullRequest
0 голосов
/ 23 марта 2012

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

Я пытаюсь сделать обновление панели, вызвав 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 Ответ

3 голосов
/ 25 марта 2012

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

...