Target Unreachable, identifier 'expre' resolved to null
jeilong Aug 6, 2007 10:52 AMI'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