0

为清楚起见,编辑了附加信息

我们正在将应用程序从 JBoss 5 迁移到 Tomee 7.0.1+。在 Tomee 上,我们使用 MyFaces 2.2.10 和 RichFaces 4.2.0(在 Jboss 上,我们使用 Mojarra JSF 而不是 MyFaces)。

我们遇到了 f:ajax 监听器没有触发单选按钮列表中的值更改的问题。这是我们的代码:

 <h:selectOneRadio value="#{managedBean.paramsType}"
   layout="pageDirection">
   <f:selectItem itemValue="Item1" itemLabel="Item1" />
   <f:selectItem itemValue="Item2" itemLabel="Item2" />
   <f:ajax render="@form" execute="@form" listener="#{managedBean.checkSelection}" />
  </h:selectOneRadio>

<h:selectManyCheckbox value="#{managedBean.objectList}" layout="pageDirection">
   <f:selectItem itemValue="checkOption1" itemLabel="Option1" itemDisabled="#{managedBean.paramsType == 'Item3'}"/>
   <f:selectItem itemValue="checkOption2" itemLabel="Option2" itemDisabled="#{managedBean.paramsType == 'Item1'}"/>
   <f:selectItem itemValue="checkOption3" itemLabel="Option3" itemDisabled="#{managedBean.paramsType == 'Item2'}"/>
</h:selectManyCheckbox>

在托管 bean 中,checkSelection 方法具有以下签名:

public void checkSelection()
{
 //update objectList (select or deselect items) based on radio button selection
}

在 TomEE 上运行应用程序时永远不会调用检查选择,但在 JBoss 上也一样(相同的代码)。

在 TomEE 上,我们尝试添加 AjaxBehaviorEvent 作为 checkSelection 方法的输入参数,但无论有没有这个参数,该方法都不会被调用。看起来 f:ajax 的侦听器属性由于某种原因没有处理事件。

浏览器控制台或应用程序或服务器日志中不会报告任何错误 - 该方法根本不会被调用。此外, h:messages 不会显示任何错误。

此外,我们尝试使用 a4j:ajax 和 valueChangeListener。a4j:ajax 的行为与 f:ajax 相同 - 不调用托管 bean 中定义的方法;valueChangeListener 对我们不起作用,因为它是由与 f:ajax 侦听器不同的事件触发的,我们需要更改单选按钮中的选择以影响对同一表单上 ah:selectManyCheckbox 组件的选择。

4

1 回答 1

0

对于新人:我几乎遇到了同样的问题,几乎用尽了互联网,没有解决方案。

从 jsf 2.2(.?) 迁移到 2.3 时解决。

顺便说一句,@#$%!@#$*,以另一种方式失去了 2 天,所以把它当作学习/记住的艰难方式,当遇到这样的问题时,总是先升级你的库......

附录:不要盲目更新你的库。

正如乔恩·贝茨(Jon Bates)所指出的那样,每一次更改都可能会在系统中引入新的错误,虽然新旧主题本身就存在争议,但人们普遍认为,在处理已经证明稳定的系统时,良好的做法是,是将更改保持在最低限度,直到归档新的期望目标。这就是为什么好的库通常有主要、次要和修订号的原因之一,看看它们。

于 2018-04-24T17:35:38.450 回答