2

RichFaces 4.2.2の調査を開始しましたが、簡単な例で問題が発生しました。xmlがあります。

<ui:define name="content">       
        <h:form>
            <rich:panel style="width: 50%">
                <h:panelGrid columns="2">
                    <h:outputText value="Name:"/>
                    <h:inputText id="inp" value="#{echoBean.name}">
                        <a4j:ajax event="keyup" render="echo count"  listener="#{echoBean.countListener}"/>
                    </h:inputText>

                    <h:outputText value="Echo:"/>
                    <h:outputText id="echo" value="#{echoBean.name}"/>

                    <h:outputText value="Count:"/>
                    <h:outputText id="count" value="#{echoBean.count}"/>
                </h:panelGrid>
                <a4j:commandButton value="Submit" actionListener="#{echoBean.countListener}" render="echo, count"/>
            </rich:panel>
        </h:form>

</ui:define>

と単純な豆:

@Component("echoBean")
@Scope(value = "session")
public class EchoBean {
private String name;
private Integer count = 0;

//getter setter methods here

public void countListener(ActionEvent event) {
    count++;
    }
}

そして、inputTextで印刷しようとすると、例外が発生します。

Caused by: javax.el.MethodNotFoundException: /home.xhtml @35,112 listener="#{echoBean.countListener}": Method not found: com.example.training.bean.EchoBean@d523fa.countListener()
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
at org.ajax4jsf.component.behavior.MethodExpressionAjaxBehaviorListener.processAjaxBehavior(MethodExpressionAjaxBehaviorListener.java:71)
at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent.java:113)
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:98)
at org.ajax4jsf.component.behavior.AjaxBehavior.broadcast(AjaxBehavior.java:348)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:763)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
... 19 more

しかし、なぜ?ボタンを使用すると、この同じリスナーは問題なく機能し、a4j:ajaxの「listener」パラメーターのドキュメントでは次のようになります。

式は、returnタイプがvoidのActionEventパラメーターを受け取るパブリックメソッド、またはreturnタイプがvoidの引数をとらないパブリックメソッドに評価される必要があります。

なぜパラメータcountListener()なしで使用するのですか?ActionEvent理解できません。

4

2 に答える 2

3

RF4で属性を使用できるようにするにはlistener、リスナーメソッドがAjaxBehaviorEvent型ではなく型の引数を取る必要がありますActionEvent。エラーメッセージからわかるように、他の代替アプローチは、引数をとらず、次のようにvoidリターン型を持つ標準のJavaメソッドを定義することです。

   public void countListener();

ActionEventパラメーターなしでcountListener()を使用するのはなぜですか?理解できません。

これはAPIの契約であり、使用できるように準拠する必要があります。

于 2012-10-23T01:29:46.887 に答える
1

次のシグニチャvoidをパラメータとして使用します。Bean関数の例は次のとおりです。

public void countListener(ActionEvent event) {}
于 2013-10-15T13:03:21.830 に答える