这基本上是对这个答案的延伸.
我试图在方法/动作调用中获取参数(对于列表/数据表中的删除按钮).
客户:
<ui:include src="...">
<ui:param name="acceptButtonBean" value="#{repoHome}" />
<ui:param name="acceptButtonAction" value="removeIndividualDocument(#{doc.id})" />
</ui:include>
Run Code Online (Sandbox Code Playgroud)
子视图:
<h:commandButton value="Continue"
action="#{acceptButtonBean[acceptButtonAction]}" />
...
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
但是,JSF失败了,例外情况说:
...yadda, yadda
02:46:02,431 ERROR [stderr] (http--127.0.0.1-8080-5) Caused by: javax.el.MethodNotFoundException: /subviews/remove-doc-clink-popup.xhtml @37,98 action="#{acceptButtonBean[acceptButtonMethod]}": Method not found: com.company.project.beans.RepoHome@34b183e7.removeExternalDocument(89)()
02:46:02,431 ERROR [stderr] (http--127.0.0.1-8080-5) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:109)
02:46:02,431 ERROR [stderr] (http--127.0.0.1-8080-5) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
02:46:02,431 ERROR [stderr] (http--127.0.0.1-8080-5) ... 31 more
Run Code Online (Sandbox Code Playgroud)
请注意
....RepoHome@34b183e7.removeExternalDocument(89)()
Run Code Online (Sandbox Code Playgroud)
它不能那样工作.JSF似乎附加括号无所谓.
它可以以不同的方式实现,但仍然采用上述技术吗?如果是这样,怎么样?
如果没有,为什么不工作?是否指定了?这是Mojarra 2.0.x的错误吗?如果有其他括号,我认为省略括号没有问题...
注意我不是在寻找替代解决方案,比如使用f:param,f:attribute或f:setPropertyActionListener.
提前致谢
Bal*_*usC 16
这确实不是有效的EL.您不能在单个变量中混合方法名称和参数.这应该工作:
<ui:include src="...">
<ui:param name="acceptButtonBean" value="#{repoHome}" />
<ui:param name="acceptButtonAction" value="removeIndividualDocument" />
<ui:param name="acceptButtonArgument" value="#{doc.id}" />
</ui:include>
Run Code Online (Sandbox Code Playgroud)
同
<h:commandButton value="Continue"
action="#{acceptButtonBean[acceptButtonAction](acceptButtonArgument)}" />
Run Code Online (Sandbox Code Playgroud)
请注意,这与JSF并不完全相关,而是与EL有关.如果是错误或功能,您需要阅读EL规范或向EL人员报告,而不是JSF报告.JSF在这里没有任何责任.EL是一个完全独立的API,JSF恰巧使用它.
更新:事实证明它适用于Tomcat 7(可能是任何其他具有org.apache.el.*实现的容器),但不适用于Glassfish 3(带有com.sun.el.*实现).显示页面时,它失败如下:
Caused by: javax.el.ELException: Error Parsing: #{p1[p2](p3)}
at com.sun.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:174)
at com.sun.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:191)
at com.sun.el.lang.ExpressionBuilder.createMethodExpression(ExpressionBuilder.java:242)
at com.sun.el.ExpressionFactoryImpl.createMethodExpression(ExpressionFactoryImpl.java:81)
at org.jboss.weld.util.el.ForwardingExpressionFactory.createMethodExpression(ForwardingExpressionFactory.java:43)
at org.jboss.weld.el.WeldExpressionFactory.createMethodExpression(WeldExpressionFactory.java:62)
at com.sun.faces.facelets.tag.TagAttributeImpl.getMethodExpression(TagAttributeImpl.java:222)
... 63 more
Caused by: com.sun.el.parser.ParseException: Encountered "(" at line 1, column 9.
Was expecting one of:
(*snip*)
Run Code Online (Sandbox Code Playgroud)
我检查了EL 2.2规范的第1.19章:
ValueSuffix ::= ‘.’ Identifier MethodParameters?
| ‘[‘ Expression ‘]’ MethodParameters? <-- Look here
MethodParameters ::= '(' (Expression (‘,’ Expression )* )? ')'
Run Code Online (Sandbox Code Playgroud)
而且我非常有信心Tomcat是对的.是时候向Glassfish男孩报告一个错误:GLASSFISH-17628.
更新2:您似乎实际上正在使用JBoss 7.我不知道它使用的Tomcat 7的哪个分支,但我可以确认我可以使用Tomcat 7.0.19重现您的问题; 按下按钮后,它失败如下:
Caused by: javax.el.MethodNotFoundException: /test.xhtml @22,62 action="#{p1[p2](p3)}": Method not found: com.example.Bean@2616aa35.submit(java.lang.String)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:109)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
... 24 more
Run Code Online (Sandbox Code Playgroud)
我成功运行时使用的是Tomcat 7.0.22,因此它已在Tomcat 7.0.20和7.0.22之间修复.
| 归档时间: |
|
| 查看次数: |
10173 次 |
| 最近记录: |