Java ApacheWicket-在ajax请求呈现时推送websocket组件更新
在我们的wicket应用程序中,我们只有一个页面,页面上的每个更改都是通过ajax完成的。但在某些情况下(例如,我们必须打开一个新数据库并初始化JPAJava ApacheWicket-在ajax请求呈现时推送websocket组件更新,java,ajax,websocket,wicket,Java,Ajax,Websocket,Wicket,在我们的wicket应用程序中,我们只有一个页面,页面上的每个更改都是通过ajax完成的。但在某些情况下(例如,我们必须打开一个新数据库并初始化JPAEntityManagerFactory等,这需要一些时间),我们通过websocket将一个可定制的“加载弹出窗口”(也是一个wicket组件)推送到客户端 这很有效,但昨天我们遇到了一个问题。到目前为止,我们总是在ajax请求的实际呈现开始之前推送弹出窗口(例如,在组件更新的意义上进行一些导航单击),但昨天我们在组件onConfigure()方
EntityManagerFactory
等,这需要一些时间),我们通过websocket将一个可定制的“加载弹出窗口”(也是一个wicket组件)推送到客户端
这很有效,但昨天我们遇到了一个问题。到目前为止,我们总是在ajax请求的实际呈现开始之前推送弹出窗口(例如,在组件更新的意义上进行一些导航单击),但昨天我们在组件onConfigure()
方法中推送弹出窗口,因此ajax请求的构建已经在运行
结果,弹出窗口像往常一样立即显示给用户,ajax请求中更新的每个组件都呈现得很好,只是websocket推送之前呈现的组件的所有domready javascript都丢失了。因此,该组件的wicket ajax单击事件不起作用,因为在响应的
标记中缺少该组件的javascript
通过调试,我已经发现,在呈现AbstractAjaxResponse.writeHeaderContribution(响应,组件)
时,会添加一个AjaxHtmlHeaderContainer
——将IHeaderResponse
——保存到页面上,当通过websocket推送时,生成另一个具有相同固定wicket id的HeaderContainer(“header”
(在HtmlHeaderSectionHandler.header id
中定义)并替换第一个,因此在为每个HeaderItems
调用渲染(HeaderItem)
之前,IHeaderResponse
将丢失,脚本也是如此
我的问题是:当ajax请求运行时,是否有任何方法可以通过websocket推送组件更新,而不会遇到所描述的问题?或者这可能是一个bug,因为更新的组件标记被正确地发送到客户端,而只有脚本丢失了
编辑:我们目前正在使用Wicket 6.15;将onBeforeRender()的onBeforeRender()更改为onConfigure()
Edit2:升级到Wicket 6.24后,问题发生了变化:当websocket请求启动时,它仍然会替换已添加到页面中的AjaxHtmlHeaderContainer
。但是websocket请求完成后,ajax请求的头仍然存在,因此脚本不会丢失。现在,整个请求都得到了正确处理,但在方法AbstractAjaxResponse.writeTo(Response,String)
的finally语句中,头不为null,代码尝试用默认头替换头。问题是,由于websocket请求,页眉不再添加到页面中,替换代码抛出一个异常,即它无法替换未添加的组件
一些附加信息:只有在AbstractAjaxResponse.writeHeaderContribution(Response,Component)
中创建时,才会将标题添加到页面中,但在websocket请求之后,ajax请求的标题不为空,因此不会再次添加到页面中
Edit3:在为该漏洞编写了一个快速启动程序后,我在Wicket 7.4中尝试了它,但问题没有出现请尝试Wicket 6.24-其中一些问题通过标题渲染解决,例如Wicket-5960。感谢您的输入。升级到Wicket 6.24后,我用新产生的问题编辑了这个问题。我看不到6.x和7.x之间有任何相关差异,这也解释了为什么它在7.x中工作。想创建一个问题并附加您的快速入门吗?我添加了一个问题,请试用Wicket 6.24-其中一些问题通过标题渲染解决,例如Wicket-5960。谢谢您的输入。升级到Wicket 6.24后,我用新产生的问题编辑了这个问题。我看不到6.x和7.x之间有任何相关差异,这也解释了为什么它在7.x中工作。想创建一个问题并附加您的快速入门吗?我添加了一个问题