多次调用ActionListener(Bug?) - Mojarra 2.1.3

时间:2011-11-08 11:18:56

标签: jsf icefaces mojarra

我有以下按钮:

   <h:commandButton 
     disabled="#{mybean.searching}"
     binding="#{mybean.searchButton}"
     actionListener="#{mybean.searchForLicenses}"
     value="Search" />

当我调试时,我看到actionListener首先被调用两次,然后被调用三次,接下来单击四次,依此类推。

似乎每次重新加载时,actionListener都会再次注册。

我正在使用Mojarra 2.1.3(也尝试过2.0.6)和Tomcat 7和IceFaces。

以这种方式完成绑定:

private javax.faces.component.UICommand searchButton;

public void setSearchButton(UICommand searchButton) {
  this.searchButton = searchButton;
}

public UICommand getSearchButton() {
  return searchButton;
}

2 个答案:

答案 0 :(得分:7)

如果您将组件绑定到会话或应用程序范围的bean而不是请求范围的bean,则会发生这种情况。这只是一个糟糕的设计。将在多个请求/视图中重用相同的组件。您需要将bean放在请求范围内,或者完全摆脱组件绑定。

请注意,将组件直接绑定到bean通常是代码中某处设计不佳的标志。是什么,您认为这是解决方案的功能要求和/或问题?如果你详细说明,我们可能会提出正确的方法。

另请注意,单独使用动作侦听器也是一种设计气味。我希望“searchForLicenses”是一种正常的动作方法。另请参阅Differences between action and actionListener

答案 1 :(得分:-1)

当组件使用bindingvalidatorvalueChangListener且辅助bean为ViewSession或{{1}时,会发生类似问题} 范围。然后在请求期间多次调用相应的侦听器(每次新请求+1次)。

一种可能的解决方案是覆盖用于存储组件Application的jsf类AttachedObjectListHolder。当前实现只是向组件添加新的listeners,即使已存在相同的listener。因此,建议的修复方法是在添加listener之前检查它是否存在。

您可以看到here

的修复详情