Java ApacheWicket-在ajax请求呈现时推送websocket组件更新

Java ApacheWicket-在ajax请求呈现时推送websocket组件更新,java,ajax,websocket,wicket,Java,Ajax,Websocket,Wicket,在我们的wicket应用程序中,我们只有一个页面,页面上的每个更改都是通过ajax完成的。但在某些情况下(例如,我们必须打开一个新数据库并初始化JPAEntityManagerFactory等,这需要一些时间),我们通过websocket将一个可定制的“加载弹出窗口”(也是一个wicket组件)推送到客户端 这很有效,但昨天我们遇到了一个问题。到目前为止,我们总是在ajax请求的实际呈现开始之前推送弹出窗口(例如,在组件更新的意义上进行一些导航单击),但昨天我们在组件onConfigure()方

在我们的wicket应用程序中,我们只有一个页面,页面上的每个更改都是通过ajax完成的。但在某些情况下(例如,我们必须打开一个新数据库并初始化JPA
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中工作。想创建一个问题并附加您的快速入门吗?我添加了一个问题