bean上的commandLink actionListener方法通过ui:param传递

时间:2012-05-29 17:49:51

标签: jsf-2 primefaces facelets

我正在使用带有PrimeFaces的JSF 2,而我的facelet有commandLinks(或commandButtons),它调用通过ui:param传入的bean的方法。

我的facelet xhtml希望dialogBean作为ui:param

传递
   <h:panelGroup>

       <p:commandButton
           value="#{msgs.ok}"
           actionListener="#{dialogBean.okClicked}"
           process="#{dialogId}"
           update="#{dialogId}, #{externalIdsToUpdateOnOk}"
           styleClass="dialogBottomBtn"
        />

        <p:commandButton
            value="#{msgs.cancel}"
            actionListener="#{dialogBean.close}"
            process="@this"
            update="#{dialogId}"
            styleClass="dialogBottomBtn"
        />

   </h:panelGroup>

facelet包含如下:

<ui:include src="/faces/common/dialogButtons.xhtml">
    <ui:param name="dialogId" value="textBlockQuestionDialog" />
    <ui:param name="dialogBean" value="#{formEditor.textBlockQuestionDialog}" />
    <ui:param name="externalIdsToUpdateOnOk" value=":form:tree, :form:properties, :form:preview" />
</ui:include>

失败并出现此错误:

javax.el.PropertyNotFoundException: Target Unreachable, 
   identifier 'dialogBean' resolved to null

我尝试将#{dialogBean.close}替换为#{dialogBean['close']},将#{dialogBean[action]}替换为action定义为param,没有任何帮助。

dialogBean及类似输出一起使用时,

h:outputText 会得到解决。此外,当我将actionListener替换为action时,此示例也有效。

任何想法?

1 个答案:

答案 0 :(得分:0)

我想我找到了答案。

仔细检查您的dialogBean对象的actionListener方法(okClicked等)是否采用ActionEvent参数。

似乎这个参数对于ui:param传递的bean是必需的,而不是其他的。

我怀疑发生的事情是这样的:

  1. 检查方法dialogBean
  2. okClicked(ActionEvent)参数
  3. 如果找不到,请使用方法dialogBean
  4. 查找名为okClicked(ActionEvent)的bean
  5. 如果找不到,请使用方法dialogBean
  6. 查找名为okClicked()的bean

    其中无参数方法仅在bean名称直接匹配时使用,而不是通过ui:param引用间接匹配。