RichFaces - Utilisation de l'attribut action
Bonjour à tous,
Je suis tout nouvellement arrivé dans JSF et RichFaces, et je me retrouve confronté à un problème que je n'arrive pas à comprendre.
J'ai défini un élément de menu comme suit (menuContentLink.xhtml) :
Code:
1 2 3 4
|
<rich:panelMenuItem hoverClass="panelMenuItemHover" label="#{label}" action="#{action}" icon="/resources/images/icons/empty.gif" style="background-color: #F4F4F4;">
<a4j:actionparam name="include" value="#{include}" assignTo="#{NavigationBean.contentInclude}" />
</rich:panelMenuItem> |
Et je réalise l'appel à ce composant par ce code :
Code:
1 2
|
<mytags:menuContentLink label="#{msgs.newAgenda}" action="#{AgendaBean.clear}" include="/pages/includes/leftNavigationAgenda/agendaEdit.xhtml" /> |
Le paramètre include fonctionne parfaitement et NavigationBean est correctement mis à jour avec l'adresse de la prochaine page à mettre dans le panel principal de ma page. Par contre, le clic sur le lien qui s'affiche exécute l'action et lève cette exception :
Code:
javax.faces.el.EvaluationException: javax.el.PropertyNotFoundException: /WEB-INF/myTags/menuContentLink.xhtml @7,169 action="#{action}": /pages/includes/navigation/leftNavigationAgenda.xhtml @9,150 action="#{AgendaBean.clear}": Property 'clear' not found on type ch.test.presentation.web.beans.AgendaBean
Mon bean est pourtant tout simple et voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| package ch.test.presentation.web.beans;
import java.io.Serializable;
import org.apache.log4j.Logger;
import ch.test.common.dto.AgendaDTO;
import ch.test.presentation.web.util.ServiceLocator;
public class AgendaBean implements Serializable {
private static final long serialVersionUID = 1L;
private AgendaDTO agenda = new AgendaDTO();
private static final Logger logger = Logger.getLogger(AgendaBean.class);
public void save(){
if(agenda.getAgendaId() == null){
ServiceLocator.getApplicationService().insertAgenda(this.agenda);
}
else{
ServiceLocator.getApplicationService().updateAgenda(this.agenda);
}
}
public void search(){
if(agenda.getAgendaId() != null){
this.agenda = ServiceLocator.getApplicationService().findAgenda(agenda.getAgendaId());
}
}
public void clear(){
logger.debug("Clearing the AgendaBean state");
this.agenda = new AgendaDTO();
}
public AgendaDTO getAgenda(){
return this.agenda;
}
public void setAgenda(AgendaDTO agenda){
this.agenda = agenda;
}
} |
La fonction clear est donc bien définie dans le bon bean, je ne vois pas pourquoi il n'est pas possible de l'appeler de la façon dont je l'ai faite (en passant l'action à réaliser en paramètre au travers de l'attribut "action" de mon composant menuContentLink).
J'arrive par contre parfaitement à appeler save() et search() à d'auters endroit de l'application, typiquement avec l'appel ci-dessous :
Code:
1 2 3
| <a4j:commandButton value="insert" action="#{AgendaBean.save}" reRender="content">
<a4j:actionparam name="include" value="/pages/includes/leftNavigationAgenda/agendaPrint.xhtml" assignTo="#{NavigationBean.contentInclude}" />
</a4j:commandButton> |
Auriez-vous une idée pourquoi l'appel par l'intermédiaire d'un passage par attribut ne fonctionne pas dans mon cas ?
Merci de m'indiquer si il faut plus de précisions par rapport à mon code, je donnerai plus de détails si besoin.