3 Replies Latest reply on Jan 24, 2008 10:43 AM by pmuir

    Target Unreachable, identifier 'expre' resolved to null

    jeilong

      I'm tearing my hair out over this simple thing I'd like to do: a conversation spanning two pages. Basically I have a table in which the user can click "edit" on a certain row. This will redirect the user to an edit page and the edit page gets populated with the selected item. So far so good. Upon clicking either save or cancel in the edit page the exception below comes up. It seems that the "supplierX" entity is nulled upon clicking either save or cancel. Am I missing some obvious logic or is this a configuration issue? We deployed this on JBoss 4.2.0.GA.

      The stack trace:

      javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
      org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:63)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:87)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:63)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:46)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:140)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:46)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
      org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
      org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
      org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
      org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
      org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
      org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
      org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
      org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
      org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
      org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
      java.lang.Thread.run(Thread.java:595)

      Caused by javax.el.PropertyNotFoundException with message: "/stemtables/supplier/edit_supplier.xhtml @30,59 value="#{suppplierX.phone}": Target Unreachable, identifier 'suppplierX' resolved to null"

      com.sun.facelets.el.TagValueExpression.getType(TagValueExpression.java:62)
      com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:81)
      javax.faces.component.UIInput.getConvertedValue(UIInput.java:934)
      javax.faces.component.UIInput.validate(UIInput.java:860)
      javax.faces.component.UIInput.executeValidate(UIInput.java:1065)
      javax.faces.component.UIInput.processValidators(UIInput.java:666)
      javax.faces.component.UIForm.processValidators(UIForm.java:229)
      javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1030)
      javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:662)
      com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100)
      com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
      com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
      javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
      org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:63)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:87)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:63)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:46)
      org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:140)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:46)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
      org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
      org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
      org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
      org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
      org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
      org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
      org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
      org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
      org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
      org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
      java.lang.Thread.run(Thread.java:595)


      The SFSB:
      @Stateful
      @Name("supplierMaintenance")
      @Scope(ScopeType.CONVERSATION)
      public class SupplierMaintenanceAction implements SupplierMaintenance {
      
       @PersistenceContext(type = PersistenceContextType.EXTENDED)
       private EntityManager entityManager;
      
       @EJB
       private SupplierFacadeLocal supplierFacade;
      
       @DataModel
       private List<Supplier> suppliers;
      
       @DataModelSelection
       @Out(value = "supplierX", required = false) // works
       @In(value = "supplierX", required = false) // doesn't work! why?
       private Supplier selectedSupplier;
      
       @Logger
       private Log log;
      
       @Begin
       @Factory("suppliers")
       public void findSuppliers() {
       log.debug("Entering findSuppliers.");
       try {
       suppliers = supplierFacade.findAllSuppliers();
       } catch (Exception e) {
       log.error("Failed to find suppliers.", e);
       }
       log.debug("Leaving findSupplier.");
       }
      
       public String edit() {
       return null;
       }
      
       @End
       public String delete() {
       Supplier toDelete = entityManager.merge(selectedSupplier);
       entityManager.remove(toDelete);
       findSuppliers();
       return null;
       }
      
       @End
       public String save() {
       Supplier toStore = entityManager.merge(selectedSupplier);
       entityManager.persist(toStore);
       findSuppliers();
       return null;
       }
      
       @End
       public String cancel() {
       return null;
       }
      
       @Remove // remove method is mandated by EJB3 specification for stateful session beans
       public void remove() {}
      
       @Destroy // destroy method is mandated by EJB3 specification for stateful session beans
       public void destroy() {}
      }


      pages.xml
      <pages
       xmlns="http://jboss.com/products/seam/pages"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.0.xsd"
       no-conversation-view-id="/login.xhtml" login-view-id="/login.xhtml">
      
       <page view-id="*">
       <navigation from-action="#{identity.logout}">
       <redirect view-id="/login.xhtml" />
       </navigation>
       </page>
      
       <page view-id="/login.xhtml">
       <navigation>
       <rule if="#{identity.loggedIn}">
       <redirect view-id="/welcome.xhtml" />
       </rule>
       </navigation>
       </page>
      
       <page view-id="/welcome.xhtml" login-required="true"></page>
      
       <!-- SUPPLIER MAINTAINCE -->
       <page view-id="/stemtables/supplier/supplier.xhtml" login-required="true">
       <navigation from-action="#{supplierMaintenance.delete}">
       <redirect view-id="/stemtables/supplier/supplier.xhtml" />
       </navigation>
       </page>
      
       <page view-id="/stemtables/supplier/supplier.xhtml" login-required="true">
       <navigation from-action="#{supplierMaintenance.edit}">
       <redirect view-id="/stemtables/supplier/edit_supplier.xhtml" />
       </navigation>
       </page>
      
       <page view-id="/stemtables/supplier/edit_supplier.xhtml" login-required="true">
       <navigation from-action="#{supplierMaintenance.save}">
       <redirect view-id="/stemtables/supplier/supplier.xhtml" />
       </navigation>
       </page>
      
       <page view-id="/stemtables/supplier/edit_supplier.xhtml" login-required="true">
       <navigation from-action="#{supplierMaintenance.cancel}">
       <redirect view-id="/stemtables/supplier/supplier.xhtml" />
       </navigation>
       </page>
      
       <!-- EXCEPTION HANDLING -->
       <exception class="org.jboss.seam.security.NotLoggedInException">
       <redirect view-id="/login.xhtml">
       <message severity="warn">You must be logged in to use this feature.</message>
       </redirect>
       </exception>
      </pages>


      web.xml
      <web-app version="2.5"
       metadata-complete="true"
       xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      
       <!-- Seam configuration -->
       <listener>
      <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
       </listener>
      
       <!-- Propagate conversations across redirects -->
       <filter>
       <filter-name>Seam Redirect Filter</filter-name>
       <filter-class>org.jboss.seam.servlet.SeamRedirectFilter</filter-class>
       </filter>
      
       <filter-mapping>
       <filter-name>Seam Redirect Filter</filter-name>
       <url-pattern>*.seam</url-pattern>
       </filter-mapping>
      
       <servlet>
       <servlet-name>Seam Resource Servlet</servlet-name>
       <servlet-class>org.jboss.seam.servlet.ResourceServlet</servlet-class>
       </servlet>
      
       <servlet-mapping>
       <servlet-name>Seam Resource Servlet</servlet-name>
       <url-pattern>/seam/resource/*</url-pattern>
       </servlet-mapping>
      
       <filter>
       <filter-name>Seam Filter</filter-name>
       <filter-class>org.jboss.seam.web.SeamFilter</filter-class>
       </filter>
      
       <filter-mapping>
       <filter-name>Seam Filter</filter-name>
       <url-pattern>/*</url-pattern>
       </filter-mapping>
      
       <!-- JSF -->
       <context-param>
       <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
       <param-value>client</param-value>
       </context-param>
      
       <context-param>
       <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
       <param-value>.xhtml</param-value>
       </context-param>
      
       <context-param>
       <param-name>facelets.DEVELOPMENT</param-name>
       <param-value>true</param-value>
       </context-param>
      
       <servlet>
       <servlet-name>Faces Servlet</servlet-name>
       <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
       <load-on-startup>1</load-on-startup>
       </servlet>
      
       <servlet-mapping>
       <servlet-name>Faces Servlet</servlet-name>
       <url-pattern>*.seam</url-pattern>
       </servlet-mapping>
      
       <!-- JSF RI -->
       <listener>
       <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
       </listener>
      
       <session-config>
       <session-timeout>10</session-timeout>
       </session-config>
      </web-app>


      /stemtables/supplier/supplier.xhtml
      <ui:composition 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.com/products/seam/taglib"
       xmlns:a="https://ajax4jsf.dev.java.net/ajax"
       template="../../template.xhtml">
      
       <!-- content -->
       <ui:define name="content">
       <div class="section">
       <h:form>
      
       <h:dataTable value="#{suppliers}" var="supplier">
       <h:column>#{supplier.supplierName}</h:column>
       <h:column>#{supplier.address}</h:column>
       <h:column>#{supplier.phone}</h:column>
       <h:column>#{supplier.URL}</h:column>
       <h:column>
       <h:commandButton value="Edit" action="#{supplierMaintenance.edit}" />
       </h:column>
       <h:column>
       <h:commandButton value="Delete" action="#{supplierMaintenance.delete}" />
       </h:column>
       </h:dataTable>
      
       <span class="errors">
       <h:messages globalOnly="true"/>
       </span>
      
       </h:form>
       </div>
       </ui:define>
      
       <!-- sidebar -->
       <ui:define name="sidebar">
       <h1>SIDEBAR SECTION</h1>
       </ui:define>
      </ui:composition>


      /stemtables/supplier/edit_supplier.xhtml
      <ui:composition 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.com/products/seam/taglib"
       template="../../template.xhtml">
      
       <!-- content -->
       <ui:define name="content">
       <div class="section">
       <h:form>
       <fieldset>
       <div>
       <h:outputLabel for="supplierName">Name: </h:outputLabel>
       <h:inputText id="username" value="#{supplierX.supplierName}" required="true">
       <s:validate />
       </h:inputText>
       <div class="errors"><h:message for="supplierName" /></div>
       </div>
       <div>
       <h:outputLabel for="address">Address: </h:outputLabel>
       <h:inputText id="address" value="#{supplierX.address}">
       <s:validate />
       </h:inputText>
       <div class="errors"><h:message for="address" /></div>
       </div>
       <div>
       <h:outputLabel for="phone">Phone: </h:outputLabel>
       <h:inputText id="phone" value="#{suppplierX.phone}">
       <s:validate />
       </h:inputText>
       <div class="errors"><h:message for="phone" /></div>
       </div>
       <div>
       <h:outputLabel for="URL">URL: </h:outputLabel>
       <h:inputText id="URL" value="#{supplierX.URL}">
       <s:validate />
       </h:inputText>
       <div class="errors"><h:message for="URL" /></div>
       </div>
       <div class="errors"><h:messages globalOnly="true" /></div>
       <div class="buttonBox">
       <h:commandButton action="#{supplierMaintenance.save}" value="Save">
       <s:conversationPropagation type="join" />
       </h:commandButton>
       </div>
       <div class="buttonBox"><h:commandButton action="#{supplierMaintenance.cancel}" value="Cancel" /></div>
       </fieldset>
       </h:form>
      
       <span class="errors">
       <h:messages globalOnly="true" />
       </span>
       </div>
       </ui:define>
      
       <!-- sidebar -->
       <ui:define name="sidebar">
       <h1>SIDEBAR SECTION</h1>
       </ui:define>
      </ui:composition>


      EAR structure:

      EAR:
      + jboss-seam-2.0.0.beta1.jar
      + jboss-el-seam-2.0.0.beta1.jar
      + ejb.jar
      + web.war

      web.war:
      WEB-INF/components.xml
      WEB-INF/faces-config.xml
      WEB-INF/pages.xml
      WEB-INF/web.xml
      WEB-INF/libjboss-seam-ui-2.0.0.beta1.jar
      WEB-INF/lib/jboss-seam-debug-2.0.0.beta1.jar
      WEB-INF/lib/jsf-facelets-1.1.13.jar