JSF将ui:param与复合组件结合起来

时间:2014-08-05 15:00:05

标签: jsf richfaces actionlistener composite-component

你已经多次在这个论坛上救了我,但是现在我真的被困住了,现在不再去哪里搜索......

我总是收到以下错误消息(警告级别,但方法也未正确执行):

javax.el.PropertyNotFoundException: Target Unreachable, identifier 'editor' resolved to null: javax.faces.FacesException: #{cc.attrs.selectionListener}

我已将问题分解为几行代码:

这是我的主要文件:

<c:forEach items="#{myBean.getEditors()}" var="currentEditor" >
    <ui:include src="#{currentEditor.getPanel()} >
        <ui:param name="editor" value="#{currentEditor} />
    </ui:include>
</c:forEach>

bean.getEditors()(会话作用域)只返回一个目前只有一个条目的列表。编辑&#39;是一个POJO,有一些简单的属性和两个监听器方法。侦听器方法仅写入日志条目。 (当然应该在将来做得更多)

包含的文件如下所示:

<h:selectOneMenu value="#{editor.menuValue}>
    <f:selectItem itemValue="Value 1" />
    <f:selectItem itemValue="Value 2" />
    <a4j:ajax event="change" listener="#{editor.menutListener()}" />
</h:selectOneMenu>
<myComponent:treeComponent id="tree" selectionListener="#{editor.treeListener()} />

我创建的组件由richfaces树组成,当点击节点时,会调用以下方法:

<a4j:jsFunction name="performSelection" action="#{cc.attrs.selectionListener} />

我非常有信心作品本身就好,因为我也在不同的地方使用它。当我从a4j:jsFunction中删除动作时,它也很完美。

对我而言,它有点像the bug JSF 1223

解决方法对我不起作用 - 可能是因为我在forEach中创建了参数。

之前我遇到过类似的问题(ui:param + component),但是能够通过将完整路径作为属性而不是参数来解决它们。但这在这里不起作用,因为它在太多不同的地方使用。

请帮助,我不能成为唯一一个遇到此问题的人,但我根本找不到任何其他线程。

修改

今天心情清新,我更接近问题了。你可以忘记整个include / forEach东西......

<myComponent:treeComponent id="tree" selectionListener="#{myBean.getSingleEditor().treeListener()} />

是否有效,而

<ui:param name="editor" value="#{myBean.getSingleEditor()} />
<myComponent:treeComponent id="tree" selectionListener="#{editor.treeListener()} />

不起作用。 那么执行JAVA代码,但是错误被写入日志,并且jsFunction的render和oncomplete方法不起作用。 我也尝试使用&#34;数据&#34;而不是&#34;行动&#34;用于检测。没有错误写入日志,但甚至没有调用JAVA方法。

1 个答案:

答案 0 :(得分:1)

经过多天的尝试和错误,我找到了一个适合我的解决方案:

我将侦听器方法拆分为一个带有JAVA类的参数和一个带有方法名称的参数(简单字符串)

现在,操作方法如下:

<a4j:jsFunction name="performSelection" action="#{cc.attrs.listenerClass[cc.attrs.listenerMethodName]}" />

不好但是工作......也许它可以帮助某人 - 或任何人可以解释更多...

顺便说一下,以下内容对我不起作用:

<a4j:jsFunction name="performSelection" action="#{cc.attrs.listenerClass[staticMethodName]}" />

虽然这没关系......

<a4j:jsFunction name="performSelection" action="#{cc.attrs.listenerClass.staticMethodName()}" />

不知道 - 也许我的脑袋一次又一次地跑到同一个墙上......