@Factory method not called
mavoine May 16, 2007 12:12 PMHi all,
I'm currently setting up Seam in an already working JSF based project. There is a hack that I wrote to call an action to init a bean when invoking a JSF page from a non-JSF servlet. I'm trying to replace it by a @Factory method but I'm really struggling here.
I'm running JSF on Resin web server using MyFaces implementation. I followed the setup instructions at chapter 21 of Seam documentation (http://docs.jboss.com/seam/1.2.1.GA/reference/en/html/configuration.html) and the bean is super simple, heavily inspired by the example found at: http://java.sys-con.com/read/180363.htm
Now my problem is that the @Factory method is never called and the server fails badly, giving me a blank page and throwing an ugly exception on the console:
javax.servlet.ServletException: Could not retrieve value of component with path : {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /faces/dataview/news.jsp][Class: javax.faces.component.html.HtmlOutputText,Id: date]} at javax.faces.webapp.FacesServlet.service(FacesServlet.java:154) at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:106) at com.caucho.server.webapp.DispatchFilterChain.doFilter(DispatchFilterChain.java:115) at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229) at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:277) at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:106) at com.firstline.report.WebActionHandler.sendJSFPage(WebActionHandler.java:190) at com.firstline.report.WebActionHandler.sendPage(WebActionHandler.java:110) at com.firstline.report.WebActionHandler.service(WebActionHandler.java:89) at com.firstline.report.WebActionHandler.service(WebActionHandler.java:36) at com.firstline.servlet.IServer.doGet(IServer.java:106) at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:106) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:63) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:53) at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:79) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49) at org.jboss.seam.web.SeamFilter.doFilter(SeamFilter.java:84) at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70) at com.firstline.servlet.filter.PersistenceSessionFilter.doFilter(PersistenceSessionFilter.java:34) at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70) at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:173) at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229) at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:274) at com.caucho.server.port.TcpConnection.run(TcpConnection.java:511) at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:520) at com.caucho.util.ThreadPool.run(ThreadPool.java:442) at java.lang.Thread.run(Thread.java:595)
My Bean :
package com.mobicom.presentation.bean.page; import java.io.Serializable; import java.util.Date; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Out; import org.jboss.seam.annotations.Scope; import com.mobicom.model.bo.Language; import com.mobicom.model.bo.News; import com.mobicom.model.dao.LanguageDAO; import com.mobicom.presentation.bean.application.SessionBean; import com.mobicom.presentation.resources.text.TextResource; import com.mobicom.presentation.util.MessageHandler; import com.mobicom.presentation.util.TextKey; import com.mobicom.service.NewsService; @Name("newsBean") @Scope(ScopeType.SESSION) public class NewsBean implements Serializable { private static final long serialVersionUID = 1L; @In ToolbarBean toolbarBean; @In SessionBean sessionBean; @Out Date postDate; @Out String postText; public String process(){ try { // update toolbar toolbarBean.setCurrentReport(ToolbarBean.CURRENT_REPORT_NOT_SET); toolbarBean.setPrinterFriendlyPath("/dynamic/faces/dataview/newsPF.jsf"); toolbarBean.setShowExportToExcel(false); toolbarBean.setReportName(TextResource.getTextResourceString(new TextKey("News"),null,sessionBean.getCurrentLocale())); toolbarBean.setRefreshAction("newsBean.process"); Language language = LanguageDAO.getInstance().findByPk(sessionBean.getLanguageCode()); News news = NewsService.getInstance().findCurrentNews(); postDate = news.getNewsTime(); postText = news.getNewsDescription().getText(language); } catch (Exception ex){ MessageHandler.handleGenericException(ex); return "error"; } return "success"; } @Factory("postDate") public void myFactory(){ process(); } public ToolbarBean getToolbarBean() { return toolbarBean; } public void setToolbarBean(ToolbarBean toolbarBean) { this.toolbarBean = toolbarBean; } public SessionBean getSessionBean() { return sessionBean; } public void setSessionBean(SessionBean sessionBean) { this.sessionBean = sessionBean; } public String getPostText() { return postText; } public void setPostText(String newsData) { this.postText = newsData; } public Date getPostDate() { return postDate; } public void setPostDate(Date postDate) { this.postDate = postDate; } }
And my page:
<%@ taglib uri="/WEB-INF/taglib/myfaces_html.tld" prefix="h"%> <%@ taglib uri="/WEB-INF/taglib/myfaces_core.tld" prefix="f"%> <%@ taglib uri="/WEB-INF/taglib/tomahawk.tld" prefix="t"%> <f:view locale="#{sessionBean.currentLocale}"> <f:loadBundle basename="com.mobicom.presentation.resources.text.TextResource" var="text"/> <jsp:include page="/inc/page-top-1.jsp"/> <!-- window title --> <h:outputText id="pageTitle" value="<title>#{text['News']}</title>" escape="false"/> <jsp:include page="/inc/page-top-2.jsp"/> <jsp:include page="/inc/main-header.jsp"></jsp:include> <jsp:include page="/faces/dataview/debugInfo.jsp"/> <div class="content"> <jsp:include page="/inc/toolbar.jsp"/> <div class="container"> <h:form id="newsForm"> <table class="standardForm" style="width: 100%;"> <tr> <th><h:outputText id="dateLabel" value="#{text['Date']}"/></th> <th><h:outputText id="newsLabel" value="#{text['News']}" escape="false"/></th> </tr> <tr> <td style="text-align: center; width: 100; font-weight: normal; background-color: #F7F7FB; "> <h:outputText id="date" value="#{newsBean.postDate}" escape="false"> <f:convertDateTime pattern="yyyy-MM-dd" timeZone="#{sessionBean.timeZone}"/> </h:outputText> </td> <td style="text-align: center; font-weight: normal; background-color: #F7F7FB;"> <h:outputText id="text" value="#{newsBean.postText}" escape="false"/> </td> </tr> </table> <table class="dataTableFooter" style="width: 100%;"> <tr> <td> <h:commandLink id="reloadLink" action="#{newsBean.process}"> <h:outputText id="reloadLinkLabel" value="#{text['Reload']}"/> </h:commandLink> </td> </tr> </table> </h:form> </div><!-- end div: container --> </div><!-- end div: content --> <jsp:include page="/inc/main-footer.jsp"/> <jsp:include page="/inc/page-bottom.jsp"/> </f:view>
Thanks for helping!
Math