如何避免jsf中的BusyConversationException

cub*_*buk 15 jsf exception-handling cdi conversation-scope weld

我在浏览jsf项目中的页面时遇到BusyConversationException.如果用户在ajax调用期间尝试导航到另一个页面,则通常会发生这种情况.当用户在单击另一个链接后立即单击链接而不等待加载页面时,也会发生这种情况.

例如,如果用户点击通过类似于下面的代码生成的多个链接,我们肯定会得到此异常.另一个例子是,假设用户在文本字段上输入查询,我们的应用程序进行ajax调用以搜索此查询.在该查询期间,如果用户单击某个按钮以导航到另一个页面,则也会发生BusyConversationException.

<h:commandLink value="#{theProfile.profileName}"
               title="#{theProfile.profileName}"
               action="#{profileBean.aProfileSelected}">
               <f:setPropertyActionListener target="#{currentProfileWebBean.theProfile}" value="#{theProfile}"/>
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)

我能赶上在一个延伸ExceptionHandlerWrapper类中的ExceptionHandler类这种类型的异常,但我不能挽救我目前的状态,我可以为这种情况下做的最好的是,当这个例外发生时重定向到主页.

有没有解决方案来避免这种情况?提前感谢您的回答和评论.

dng*_*fng 2

正如其他答案中提到的,如果 ajax 请求仍在处理中,或者在实际单击提交的 commandLink 或 commandButton 之前触发了 ajax 事件(例如通过输入字段上的更改事件),则会发生这种情况。

因此,不可能避免BusyConversationExceptions onclick="preventEventPropagation(event)";,因为 AJAX 事件不是通过传播触发的。

通过侦听正在运行的 ajax 请求并阻止提交直到挂起的 ajax 事件完成,可以轻松避免此问题。

这篇博客文章JSF2 AJAX/Submit 对话问题更详细地解释了该问题和解决方案。