2012-10-12 2 views
2

Я начал исследование RichFaces 4.2.2 и есть проблемы в простом примере, у меня есть XML:a4j: Аякс слушатель исключение MethodNotFoundException

<ui:define name="content">  
     <h:form> 
      <rich:panel style="width: 50%"> 
       <h:panelGrid columns="2"> 
        <h:outputText value="Name:"/> 
        <h:inputText id="inp" value="#{echoBean.name}"> 
         <a4j:ajax event="keyup" render="echo count" listener="#{echoBean.countListener}"/> 
        </h:inputText> 

        <h:outputText value="Echo:"/> 
        <h:outputText id="echo" value="#{echoBean.name}"/> 

        <h:outputText value="Count:"/> 
        <h:outputText id="count" value="#{echoBean.count}"/> 
       </h:panelGrid> 
       <a4j:commandButton value="Submit" actionListener="#{echoBean.countListener}" render="echo, count"/> 
      </rich:panel> 
     </h:form> 

</ui:define> 

и простой боб:

@Component("echoBean") 
@Scope(value = "session") 
public class EchoBean { 
private String name; 
private Integer count = 0; 

//getter setter methods here 

public void countListener(ActionEvent event) { 
    count++; 
    } 
} 

И когда я пытаюсь напечатать в inputText, у меня есть исключение:

Caused by: javax.el.MethodNotFoundException: /home.xhtml @35,112 listener="#{echoBean.countListener}": Method not found: [email protected]() 
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102) 
at org.ajax4jsf.component.behavior.MethodExpressionAjaxBehaviorListener.processAjaxBehavior(MethodExpressionAjaxBehaviorListener.java:71) 
at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent.java:113) 
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:98) 
at org.ajax4jsf.component.behavior.AjaxBehavior.broadcast(AjaxBehavior.java:348) 
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:763) 
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775) 
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267) 
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) 
... 19 more 

Но почему? С кнопкой этот же прослушиватель работает отлично, а в документах для параметра «слушатель» в a4j: ajax говорится, что:

Выражение должно оцениваться публичным методом, который принимает параметр ActionEvent с типом возвращаемого значения void, или публичному методу, который не принимает аргументов с возвратным типом void

Почему он использует countListener() без параметра ActionEvent? Я не понимаю.

ответ

3

Для того чтобы вы могли использовать атрибут listener с RF4, ваш метод слушателя должен принимать аргумент типа AjaxBehaviorEvent, а не типа ActionEvent. Другой альтернативный подход, как вы можете видеть из сообщения об ошибке, чтобы определить стандартный метод Java, который не принимает аргументы и имеет тип возвращаемого недействительным как в

public void countListener(); 

Почему он использует countListener() без ActionEvent параметр? Я не понимаю.

Настоящий контракт на API, который должен соответствовать, чтобы иметь возможность его использовать.

+0

Thx я прочитал о Faces ActionEvent и не нашли ничего о AjaxBehaviourEvent – Wizzard

+0

AjaxBehaviorEvent – user738048

1

Используйте функцию боба со следующей подписью пустоте в качестве возвращаемого типа объект ActionEvent в качестве параметра Пример для функции рожкового как ниже

public void countListener(ActionEvent event) {} 
Смежные вопросы