1

私は Primefaces 3.3.1 を使用しており<p:selectOneMenu>、新しい値を選択している場所があります。新しい値を選択すると、値が処理されている場所で valueChangeListener メソッドが呼び出されます。このような:

<h:form>
    <p:selectOneMenu id="signature-menu" value="#{objectBuffertBean.loggedInSignature}" effect="fold" style="width: 125px;">
        <p:ajax event="change" update="signature-menu" 
                listener="#{loginBean.changeSignature()}" />
        <f:selectItems value="#{signaturesBean.signatures}" />
    </p:selectOneMenu>
</h:form>

LoginBean.java:

public void changeSignature(ValueChangeEvent e) {
    if (e.getNewValue() != null) {
        try {
            WebDB db = new WebDB();

            SessionHandler.getInstance().
                    getCurrentObjectBuffert().setSignature(
                    db.getSignatureBySignatureFromWebDb(
                                           (String) e.getNewValue()
                    ));
        } catch (DatabaseException e1) {
            e1.printStackTrace();
        }
    }
}

しかし、奇妙なことに、新しい値を選択すると、次の例外が発生します。

javax.el.MethodNotFoundException: Method changeSignature not found

そしてそれはうまくいきます!メソッドが何らかの形で呼び出され、新しい値が処理されています!! 同じ奇妙な合併症を持っている人はいますか?

4

1 に答える 1

5

の属性と/valueChangeListenerの属性をUIInput混同しています。引数は、属性の背後にあるメソッドでのみサポートされています。/の属性の背後にあるメソッドは、引数を取る必要があります (または何も取らない)。listener<p:ajax><f:ajax>ValueChangeEventvalueChangeListenerlistener<p:ajax><f:ajax>AjaxBehaviorEvent

そう

 public void changeSignature(AjaxBehaviorEvent e) {
     if (loggedInSignature != null) {
         // ...
     }
 }

また

 public void changeSignature() {
     if (loggedInSignature != null) {
         // ...
     }
 }

送信された値は、UIInputコンポーネントのvalue属性の背後にあるプロパティに既に設定されているため、何らかの方法でイベントによって取得する必要はありません。これは、valueChangeListener. また、valueChangeListener技術的には、メソッドに古い値と新しい値の両方を含める場合にのみ使用する必要があります。


具体的な問題とは関係ありませんが、 のevent="change"属性<p:ajax>はすでにデフォルトになっています。省略できます。また、属性からのこれらのメソッド括弧は、listener値を追加しないため、できれば省略する必要があります。を使用するだけlistener="#{loginBean.changeSignature}"です。

于 2012-07-27T13:31:52.457 に答える