2012-07-27 41 views
1

我正在使用Primefaces 3.3.1并且有一个<p:selectOneMenu>,我正在选择一个新值。当选择一个新值时,正在处理值的地方调用valueChangeListener方法。就像这样:<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

你混淆的UIInputvalueChangeListener属性与<p:ajax>/<f:ajax>listener属性。 ValueChangeEvent参数仅在valueChangeListener属性后面的方法上受支持。 listener属性<p:ajax>/<f:ajax>后面的方法必须采取AjaxBehaviorEvent参数(或者什么也没有)。

所以

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

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

注意,提交的值已经被设置在UIInput组件的value属性后面的属性,所以没有必要通过事件来获得它在某种程度上。这是因为它在调用操作阶段运行,而不是像valueChangeListener那样的验证阶段。此外,valueChangeListener应在技术上只有被用来当你打算有这两个旧的和新的价值的方法。


无关到具体的问题中,<p:ajax>event="change"属性已经是默认的。你可以忽略它。还应该优先忽略来自listener属性的那些方法括号,因为它不增加任何值。只需使用listener="#{loginBean.changeSignature}"

+0

感谢BalusC为您详细的答复。我得到了我需要的东西:) – ClydeFrog 2012-07-27 13:49:30

+0

不客气。 – BalusC 2012-07-27 13:50:19

0
<p:column headerText="#{msgs['lbl.filter.name.bank']}" styleClass="content-left"> 
            <p:selectOneMenu style="width:100%;" id="idBank" valueChangeListener="#{registerCollectionRightMgmtBean.bankChangeEvent}" 
             value="#{searchRegisterResultTO.bankFilter.idBankPkSelected}"> 
             <f:selectItem itemLabel="#{gmsgs['cbo.opt.select']}" /> 
             <f:selectItems var="bank" value="#{searchRegisterResultTO.bankFilter.listBankProvider}" 
              itemValue="#{bank.idBankPk}" itemLabel="#{bank.description}"/> 
             <p:ajax event="valueChange" immediate="true" process="@this"/> 
            </p:selectOneMenu> 
           </p:column> 



public void bankChangeEvent(ValueChangeEvent event){ 
    System.out.println("New: "+event.getNewValue()+", Old: "+event.getOldValue()); 

}

+0

这不是一个答案。这是一些孤立的无证非常格式化的代码。 – Kukeltje 2018-03-01 19:06:42

相关问题