gpt4 book ai didi

java - 使用icepush wicket集成并尝试从另一个类调用"No RequestCycle is currently set!"时出现'push()'异常

转载 作者:行者123 更新时间:2023-12-02 00:26:49 26 4
gpt4 key购买 nike

好的,就到这里。这是我的第一个 wicket 应用程序,我正在尝试使用 Pushpanel 示例集成icepush。

我想做的是通过调用另一个类的“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)

最佳答案

欢迎来到异步世界:-) ThreadLocals(Application、Session 和 ThreadLocal)仅在处理 http 请求线程(也称为工作线程)期间可用。因此存在两个问题:1)通过启动您自己的线程,您会丢失 ThreadLocal,2)即使您导出它们,当您的工作完成时,响应也有可能已经关闭。我不确定 IcePush 是如何工作的,但我认为这是最好的选择 - 提交任务,在应用程序中保留对其的引用(例如 map ),然后启动一个 ajax 计时器行为,询问 futureTask.isDone()定期,当它返回 true 时,您需要更改层次结构(我在堆栈跟踪中看到对 MarkupContainer#remove() 的调用)。

关于java - 使用icepush wicket集成并尝试从另一个类调用"No RequestCycle is currently set!"时出现'push()'异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9842788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com