我正在使用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>
login 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
它的工作原理!正在以某种方式调用该方法,正在处理新值!有没有人有同样奇怪的并发症?
你把valueChangeListener
的UIInput
属性与listener
/ <p:ajax>
的<f:ajax>
属性混淆了。 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
在技术上只应在您打算在方法中同时具有旧值和新值时使用。
与具体问题无关,event="change"
的<p:ajax>
属性已经是默认值。你可以省略它。另外,listener
属性中的方法括号应该优先省略,因为它没有添加任何值。只需使用listener="#{loginBean.changeSignature}"
。
<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());
}