将actionListener方法名称作为参数传递以包含视图

Mig*_*ore 4 facelets jsf-2

我正在尝试将动作参数传递给我的页面中的局部视图,但出于某种原因,它表示我的参数是null,即使它是在外部页面中使用的bean.

页:

<ui:include src="/templates/common/ajaxConfirmPopup.xhtml">
    <ui:param name="bean" value="#{paginaBean}" />
    <ui:param name="action" value="deleteAll" />
</ui:include>
Run Code Online (Sandbox Code Playgroud)

在部分中调用动作:

actionListener="#{bean[action]}"
Run Code Online (Sandbox Code Playgroud)

但我得到以下异常:

Caused by: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolved to null
    at org.apache.el.parser.AstValue.getTarget(AstValue.java:98) [jbossweb-7.0.13.Final.jar:]
    at org.apache.el.parser.AstValue.invoke(AstValue.java:244) [jbossweb-7.0.13.Final.jar:]
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

注意:当方法有ActionEvent参数时,一切正常,当方法没有参数时,它不工作.

Bal*_*usC 5

如果您已经actionListener在EL 2.2语法中声明了方法而没有任何参数,则可以解释此问题,如下所示:

actionListener="#{bean.method()}"
Run Code Online (Sandbox Code Playgroud)

确实期望一种无争议的方法.但是,标准的 JSF方式如下

actionListener="#{bean.method}"
Run Code Online (Sandbox Code Playgroud)

真的希望有一个ActionEvent论点.你提的问题确实历史表明您正在使用EL 2.2语法所有的时间,因此你会莫名其妙地认为它是"标准",而事实并非如此.

当参数化actionListener包含模板的方法时actionListener="#{bean[action]}",如actionListener方法中所示,该方法被解释为

actionListener="#{bean.method}"
Run Code Online (Sandbox Code Playgroud)

因此期望一个ActionEvent论点.

您基本上有3个选项来解决此问题:

  1. ActionEvent在方法中指定参数,没有任何借口.

  2. 替换actionListeneraction.保持该方法没有问题void.如果如Eclipse的EL验证抽搐,只是语气它的偏好.

  3. 像这样使用EL 2.2语法actionListener="#{bean[action]()}".然而,早期的Tomcat和Glassfish版本都失败了.

也可以看看: