f:ajax侦听器,其参数不适用于复合组件

f:ajax侦听器,其参数不适用于复合组件,ajax,jsf,jsf-2,listener,Ajax,Jsf,Jsf 2,Listener,当我尝试在复合组件中传递af:ajax时,我的所有侦听器参数都解析为null <c:forEach var="paragraph" items="#{Chapiter.paragraphList}"> <c:forEach var="field" items="#{paragraph.fieldList}"> <util:inputNumber type="double" value="#{field.value}" decimal="2">

当我尝试在复合组件中传递a
f:ajax
时,我的所有侦听器参数都解析为null

<c:forEach var="paragraph" items="#{Chapiter.paragraphList}"> 
  <c:forEach var="field" items="#{paragraph.fieldList}"> 
    <util:inputNumber type="double" value="#{field.value}" decimal="2"> 
        <f:ajax listener="#{myean.doSomething(field, paragraph)}"> 
        </f:ajax>
    </util:inputNumber>
  </c:forEach> 
</c:forEach>

当然,我已经像这样在我的复合组件中添加了一个客户端行为

listener方法在blur事件上被调用,但我的参数“field”和“paragration”总是空值

我认为这些变量不能从复合组件访问

我试图通过复合属性将这两个变量传递给复合组件,但我认为这不是一个干净的解决方案

有没有正确的方法


感谢您的关注。

如果您想将参数作为字符串传递,需要这样编写:

<f:ajax listener="#{myean.doSomething('arg1', 'arg2')}">

否则,它将期望
arg1
arg2
被定义为变量。我假设您将函数定义为接受2个字符串作为参数

另外-您确定您的侦听器执行了吗?您是如何尝试获取这些值的。请共享代码。

视图生成期间运行
,因此
段落
字段
变量仅在视图生成期间可用。它们在组件树访问期间或视图渲染期间不可用。ajax操作侦听器方法是在JSF组件树访问期间确定的,而不是在视图构建期间确定的,因此参数将始终解析为
null

如果您将
替换为
(并确保您使用的是最新的Mojarra版本,其中所有特殊的
问题都得到了解决),并将bean放在视图范围中,同时保持getter不受业务逻辑的影响,那么它应该可以正常工作

另见:

你好,jedrus07,谢谢你的回答。我的参数不是字符串,而是复杂的对象。它们的值很难编码。我在调试模式下运行我的应用程序,我确信我的侦听器会执行,但它总是得到NullPointerException。当我检查参数值时,它们总是解析为null。我认为问题在于组合组件无法访问两个变量arg1和arg2。我想知道是否有一种方法可以在不创建新的复合属性的情况下将它们作为参数传递给复合组件。我已经通过创建一个HashMap复合属性解决了这个问题,该属性将包含我的所有参数
,就像我一直构建一个包含参数arg1和arg2的HashMap一样<代码>
我不确定这是一种干净的方法。如果arg1和arg2已经不可访问,那么您需要创建它们,这使您的解决方案成为唯一的出路(据我所知)。您最初是如何按照示例代码获得arg1和arg2的(如果有的话):
我的参数实际上是字段和段落,我需要在调用我的侦听器时使用它们。c:forEach会让人非常头痛。我建议谷歌解决这个问题,并考虑在不使用c:forEach的情况下构建它(如果可能的话)。你能把这些信息都加到你的问题上吗?通过这样做,您将有更大的机会得到一个好的答案,然后我们可以删除这些评论。谢谢。我刚刚测试了你的解决方案。起初,我的监听器没有启动,但在将Mojarra版本更新到最新版本后,它工作得非常好。