<p:selectonemenu>上的Valuechangelistener有效,但抛出异常。为什么</P:selectOneMenu用于>

时间:2012-07-27 13:22:47

标签: jsf-2 primefaces selectonemenu valuechangelistener

我正在使用Primefaces 3.3.1,并且<p:selectOneMenu>我正在选择一个新值。选择新值时,将在正在处理值的位置调用valueChangeListener-method。像这样:

<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

它有效!正在以某种方式调用该方法,正在处理新值! 是否有人有同样奇怪的并发症?

2 个答案:

答案 0 :(得分:5)

valueChangeListener UIInput listener属性与<p:ajax> / <f:ajax>的{​​{1}}属性相混淆。仅ValueChangeEvent属性后面的方法支持valueChangeListener参数。 listener / <p:ajax>的{​​{1}}属性背后的方法必须采用<f:ajax>参数(或者什么都不是)。

所以

AjaxBehaviorEvent

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

请注意,已提交的值已在 public void changeSignature() { if (loggedInSignature != null) { // ... } } 组件的UIInput属性后面的属性上设置,因此不需要以某种方式获取该事件。这是因为它在调用操作阶段而不是value之类的验证阶段运行。此外,当您打算同时方法中的旧值和新值时,valueChangeListener在技术上应该


无关具体问题,valueChangeListener的{​​{1}}属性已经是默认属性。你可以省略它。同样,最好省略event="change"属性中的方法括号,因为它没有添加任何值。只需使用<p:ajax>

答案 1 :(得分: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());

}