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>

登录Bean.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 回答