0 Replies Latest reply on May 16, 2007 12:12 PM by Mathieu Avoine

    @Factory method not called

    Mathieu Avoine Newbie

      Hi 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