2012-03-23 70 views
0

好的,在这里。这是我第一次使用wicket应用程序,我尝试使用pushpanel示例来整合icepush。”目前没有RequestCycle设置!“当使用icepush wicket集成并尝试从另一个类别调用'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) 

回答

3

欢迎异步世界:-) ThreadLocals(Application,Session和ThreadLocal)仅在处理http请求线程(也称为工作线程)时可用。 所以有两个问题:1)通过开始你自己的线程,你失去了ThreadLocal的,2)即使你导出它们,那么当你的工作完成时,响应可能已经关闭。我不确定IcePush是如何工作的,但我认为这是最好的选择 - 提交任务,在应用程序中保留对它的引用(例如Map),然后启动一个询问futureTask.isDone()的ajax计时器行为,定期地,并且当它返回true时,层次结构会发生变化(我在堆栈跟踪中看到对MarkupContainer#remove()的调用)。

+0

这听起来很有希望,但我恐怕我不太了解如何去做你的建议。关于应该发生什么和什么时候,你能否更具体些? – icecreamhead 2012-03-25 20:07:06

相关问题