我的页面:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
xmlns:compo="http://java.sun.com/jsf/composite/test">
<h:head>
</h:head>
<h:body>
<h:form>
<compo:composite changeListener="#{testBean.invoke}"/>
</h:form>
</h:body>
</html>
我的复合组件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<composite:interface>
<composite:attribute name="changeListener" required="true"
method-signature="java.lang.Object action(javax.faces.event.AjaxBehaviorEvent)"/>
</composite:interface>
<composite:implementation>
<h:commandButton value="Click">
<f:ajax event="click" listener="#{cc.attrs.changeListener}"/>
</h:commandButton>
</composite:implementation>
</html>
我的java bean(春天的原型范围):
public class Bean {
public void invoke(javax.faces.event.AjaxBehaviorEvent event) {
// some logic
}
}
当我尝试按下按钮时,我看到了
02-Jul-2014 01:24:22.242 WARNING [http-apr-8080-exec-43] com.sun.faces.lifecycle.InvokeApplicationPhase.execute 0
java.lang.ArrayIndexOutOfBoundsException: 0
at org.apache.el.parser.AstValue.convertArgs(AstValue.java:287)
at org.apache.el.parser.AstValue.invoke(AstValue.java:241)
在日志中。对于某些情况我得到:java.lang.NumberFormatException: For input string: testBean.invoke
所以,这是JSF错误或我做错了什么?我如何在复合组件中传递方法表达式?
答案 0 :(得分:0)
看起来像JSF错误https://java.net/jira/browse/JAVASERVERFACES-2758 例外情况有所不同,但如果您在浏览器中打开响应,则会看到PropertyNotFoundException。
对我来说解决方法:不传递MethodExpression,而是分别传递bean和methodName并执行侦听器
listener="#{cc.attrs.bean[cc.attrs.method]}"
答案 1 :(得分:-1)
堆栈跟踪它看起来像Apache表达式语言解析器形成Tomcat(org.apache.el.parser)。我认为是这个问题:https://bz.apache.org/bugzilla/show_bug.cgi?id=57855(调用具有错误的pram计数的MethodExpression导致ArrayIndexOutOfBoundsException)。