s:viewAction not fired with JBoss 7.1.1 and and f:viewParam no longer set
pilou13 May 28, 2012 3:40 PMI just don't understand why including Seam-faces 3.0.2 and its dependencies the f:viewParam is no longer set ?
I directly type the GET url in the browser :
http://localhost:8080/proto-pilot/pilot.faces?id=13
the page is
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:s="http://jboss.org/seam/faces"> <f:metadata> <f:event listener="#{pilotAction.prepare}" type="preRenderView" /> <f:viewParam name="id" value="#{pilotAction.id}" /> <s:viewAction action="#{pilotAction.prepareBis}" /> </f:metadata> <h:head> <meta http-equiv="Cache-Control" content="no-store" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title><ui:insert name="title">Default title</ui:insert></title> </h:head> <h:body> <h:messages globalOnly="false" /> <h:form> <h:panelGrid columns="2"> <h:outputLabel value="#{appMsg['pilot.firstname']}" /> <h:inputText label="#{appMsg['pilot.firstname']}" value="#{pilotHolder.pilot.firstname}" /> <h:outputLabel value="#{appMsg['pilot.lastname']}" /> <h:inputText label="#{appMsg['pilot.lastname']}" value="#{pilotHolder.pilot.lastname}" /> <h:outputLabel value="#{appMsg['pilot.age']}" /> <h:inputText label="#{appMsg['pilot.age']}" value="#{pilotHolder.pilot.age}" required="true" validator="#{pilotAction.validateAge}" /> <h:outputLabel value="#{appMsg['pilot.level']}" /> <h:selectOneMenu value="#{pilotHolder.pilot.level}"> <f:selectItem noSelectionOption="true" itemLabel="" /> <f:selectItems value="#{levels.list}" var="w" itemValue="#{w}" itemLabel="#{w.name}" itemKey="#{w.id}" /> <f:converter converterId="objectConverter" /> </h:selectOneMenu> <h:outputLabel value="#{appMsg['pilot.team']}" /> <h:selectOneMenu value="#{pilotHolder.pilot.team}"> <f:selectItem noSelectionOption="true" itemLabel="" /> <f:selectItems value="#{teams.list}" var="w" itemValue="#{w}" itemLabel="#{w.name}" itemKey="#{w.id}" /> <f:converter converterId="objectConverter" /> </h:selectOneMenu> </h:panelGrid> <h:commandButton action="#{pilotAction.doMerge}" value="#{pilotHolder.pilot.id ne null ? appMsg['pilot.update'] : appMsg['pilot.create']}" /> </h:form> </h:body> </html>
my java cdi bean :
@javax.inject.Named @javax.enterprise.context.RequestScoped public class PilotAction implements Serializable { @Inject private PilotHolder pilotHolder; @EJB private PilotService pilotService; /** * set with the HttpParam * * <pre> * <f:viewParam name="id" value="#{pilotAction.id}" /> * </pre> */ private Long id; public void prepareBis() { System.out.println("hello"); } /** * <pre> * <f:metadata> * <f:event listener="#{pilotAction.prepare}" type="preRenderView" /> * <f:viewParam name="id" value="#{pilotAction.id}" /> * </f:metadata> * </pre> */ public void prepare() { FacesContext context = FacesContext.getCurrentInstance(); HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); String method = request.getMethod(); Object o = request.getParameter("id"); System.out.println(o); if ("GET".equals(method)) { // this means first CALL to the page if (id != null) { // this means UPDATE Pilot pilot = pilotService.selectPilotById(id); // It would be nice to have OUTJECTION here. // forces Pilot object on Holder, when a new process (update) starts // the Holder play the role a data bag in session, it is very close to a // conversation // scope ... pilotHolder.setPilot(pilot); } else { // this means CREATE pilotHolder.setPilot(new Pilot()); } } } public void setId(Long id) { this.id = id; } public Long getId() { return id; }
With the debugger :
the <f:event listener="#{pilotAction.prepare}" type="preRenderView" /> is called OK
the setter on id setId() is never called : <f:viewParam name="id" value="#{pilotAction.id}" />
the action prepareBis() is never called : <s:viewAction action="#{pilotAction.prepareBis}" />
I checked on the HttpRequest instance, and yes the "id" http paramter is there with the right value => 13
If I remove all the jars from seam and its dependency, the setter setId() is called again,
any explaination ?