2012-07-27 3 views
1

저는 Primefaces 3.3.1을 사용하고 있습니다. 새로운 값을 선택하는 곳은 <p:selectOneMenu>입니다. 새 값을 선택할 때 값이 처리되는 곳에서 valueChangeListener-method가 호출됩니다. 이처럼 :<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 :

javax.el.MethodNotFoundException: Method changeSignature not found 

그리고 그것을 :

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(); 
     } 
    } 
} 

그러나 이상한 것은 내가 새 값을 선택하고있을 때 나는이 예외를 얻을 수 있다는 것입니다 공장! 메소드가 어떻게 든 호출되고 새 값이 처리됩니다! 동일한 이상한 합병증을 가진 사람이 있습니까?

답변

4

당신은 <p:ajax>/<f:ajax>listener 속성으로 UIInputvalueChangeListener 속성을 혼동하고 있습니다. ValueChangeEvent 인수는 valueChangeListener 특성 뒤에있는 메서드에서만 지원됩니다. listener 속성 뒤에있는 메서드는 <p:ajax>/<f:ajax>이어야하며 AjaxBehaviorEvent 인수를 가져야합니다.

제출 된 값이 이미 UIInput 구성 요소의 value 속성 뒤에 재산에 설정, 그래서 어떻게 든 이벤트에 의해 그것을 얻을 필요가 없습니다 있도록

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

또는

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

. 이것은 valueChangeListener과 같은 유효성 검사 단계 대신 호출 동작 단계에서 실행되기 때문입니다. 또한 valueChangeListener은 기술적으로 일 때 만 사용해야합니다.은 메소드의 이전 값과 새 값입니다. 구체적인 문제에 관련없는


<p:ajax>event="change" 속성은 이미 기본값입니다. 당신은 그것을 생략 할 수 있습니다. 또한 listener 속성의 메소드 괄호는 값을 추가하지 않으므로 생략해야합니다. 그냥 listener="#{loginBean.changeSignature}"을 사용하십시오.

+0

감사 BalusC 상세한 응답. 나는 내가 필요한 것을 가지고있다 :) – ClydeFrog

+0

당신을 진심으로 환영한다. – BalusC

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

관련 문제