具有ajax调用的复合组件的ArrayIndexOutOfBoundsException

时间:2014-07-01 21:32:01

标签: jsf jsf-2 composite-component

我的页面:

<?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错误或我做错了什么?我如何在复合组件中传递方法表达式?

2 个答案:

答案 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)。