<p:selectOneMenu>上的Valuechangelistener可以工作,但是会引发异常。为什么?

Cly*_*rog 1 selectonemenu valuechangelistener primefaces jsf-2

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,奇怪的是,当我选择一个新值时,会出现以下异常:

javax.el.MethodNotFoundException: Method changeSignature not found
Run Code Online (Sandbox Code Playgroud)

而且有效!该方法被以某种方式调用,并且正在处理新值!有谁有同样的奇怪并发症吗?

Bal*_*usC 5

你混淆valueChangeListener的属性UIInputlistener属性<p:ajax>/ <f:ajax>ValueChangeEvent仅在valueChangeListener属性后面的方法上支持该参数。/ listener属性背后的方法必须带有参数(或什么也没有)。<p:ajax><f:ajax>AjaxBehaviorEvent

所以

 public void changeSignature(AjaxBehaviorEvent e) {
     if (loggedInSignature != null) {
         // ...
     }
 }
Run Code Online (Sandbox Code Playgroud)

要么

 public void changeSignature() {
     if (loggedInSignature != null) {
         // ...
     }
 }
Run Code Online (Sandbox Code Playgroud)

请注意,已提交的值已在UIInput组件属性后面的value属性上设置,因此不需要通过事件获取它。这是因为它在调用操作阶段而不是在验证阶段(如)运行valueChangeListener。同样,从valueChangeListener技术上讲,当您打算在方法中同时拥有新旧值时,应使用。


具体问题无关,的event="change"属性<p:ajax>已经是默认值。您可以忽略它。同样,listener最好省略属性的那些方法括号,因为它不增加任何值。只需使用listener="#{loginBean.changeSignature}"