FacesException: Cannot get value for expression '...' when expression is valid
------------------------------------------------------------------------------
Key: MYFACES-855
URL: http://issues.apache.org/jira/browse/MYFACES-855
Project: MyFaces
Type: Bug
Components: General
Versions: 1.1.0
Environment: IBM WebSphere 5.1.1.3, Windows Server 2003, JDK 1.4.2, Hibernate
3.0
Reporter: Brett Sabell
I have a dataTable whose value is a List property ( ruleInstanceList ) in a
backing bean ( listRuleInstancesBean ). The List is populated by Hibernate 3.0,
and is accessible via its own public getter/setter methods in the bean (
getRuleInstanceList() and setRuleInstanceList() ). However, when I attempt to
display the page I receive the following message ( instead of the dataTable ):
Error 500: Cannot get value for expression '#{ruleInstanceRow.ruleInstanceId}'
"ruleInstanceRow" is the var set up for the dataTable, and is of type
RuleInstance ( a class I wrote ). This class contains a property called
"ruleInstanceId", which has public getter/setter methods. Other columns are
included in the dataTable and are mapped to other properties in
ruleInstanceRow, but ruleInstanceId is the first; I removed it, tried again,
and received the same error for the next column.
In the systemOut.log file for WebSphere, the following exception stack trace
was dumped:
[22/11/05 10:51:49:844 EST] 3a5327e8 WebGroup E SRVE0026E: [Servlet
Error]-[Cannot get value for expression
'#{ruleInstanceRow.ruleInstanceId}']: javax.faces.FacesException:
Cannot get value for expression '#{ruleInstanceRow.ruleInstanceId}'
at
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:421)
at
org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234)
at
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:300)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:95)
at
com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java:110)
at
com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java:174)
at
com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java:313)
at
com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet.java:116)
at
com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java:283)
at
com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletReferenceState.java:42)
at
com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceReference.java:40)
at
com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:76)
at com.thenational.filter.RoleFilter.doFilter(RoleFilter.java:107)
at
com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:132)
at
com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:71)
at jcifs.http.NtlmHttpFilter.doFilter(NtlmHttpFilter.java:118)
at
com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:132)
at
com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:71)
at
com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java:1040)
at
com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:600)
at
com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:201)
at
com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java:125)
at
com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:286)
at
com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java:71)
at
com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java:182)
at
com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java:334)
at
com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java:56)
at
com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:624)
at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:458)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:912)
Caused by: javax.servlet.ServletException: Cannot get value for expression
'#{ruleInstanceRow.ruleInstanceId}'
at
com.ibm.ws.webcontainer.jsp.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:416)
at
com.ibm.ws.webcontainer.jsp.servlet.JspServlet.serviceJspFile(JspServlet.java:683)
at
com.ibm.ws.webcontainer.jsp.servlet.JspServlet.service(JspServlet.java:781)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java:110)
at
com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java:174)
at
com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java:313)
at
com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet.java:116)
at
com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java:283)
at
com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletReferenceState.java:42)
at
com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceReference.java:40)
at
com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java:1044)
at
com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:600)
at
com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:201)
at
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:415)
... 29 more
The backing bean is configured in my faces-config.xml file, with the correct
package/class. I put in some debugging statements in my getRuleInstanceList()
method, and determined that a valid non-null List is correctly being returned
by Hibernate, and it contains one element of type RuleInstance, which has all
of the properties that are referenced in the dataTable columns. Therefore, I
cannot see why MyFaces can't get the values!
Here are the relevant snippets of code:
faces-config.xml
=============
<managed-bean>
<managed-bean-name>listRuleInstancesBean</managed-bean-name>
<managed-bean-class>com.thenational.otkr.dmi.beans.ListRuleInstancesBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
ListRuleInstancesBean.java
======================
public class ListRuleInstancesBean extends BaseBean
{
protected UIData ruleInstanceTable;
private List ruleInstanceList;
private static final Logger logger =
Logger.getLogger(ListRuleInstancesBean.class);
public List getRuleInstanceList()
{
if (ruleInstanceList == null)
{
ruleInstanceList = new ArrayList(0);
try
{
ruleInstanceList =
getDao().getAllRuleInstances(); // getDao() returns a Hibernate3 DAO object
}
catch (Exception e)
{
// Log error
logger.error("Exception in
getRuleInstanceList(): " + e.toString());
}
}
return ruleInstanceList;
}
public void setRuleInstanceList(List ruleInstanceList)
{
this.ruleInstanceList = ruleInstanceList;
}
public UIData getRuleInstanceTable()
{
return ruleInstanceTable;
}
public void setRuleInstanceTable(UIData ruleInstanceTable)
{
this.ruleInstanceTable = ruleInstanceTable;
}
}
RuleInstance.java
==============
public class RuleInstance extends ModelBase implements Comparable
{
private Long ruleInstanceId;
private Long ruleId;
private String ruleInstanceGroup;
private Long schemaInstanceId;
private Long deskId;
private Long sourceSystemId;
private Integer severity;
private boolean activeFlag = false;
public Long getRuleInstanceId() {
return ruleInstanceId;
}
public void setRuleInstanceId(Long ruleInstanceId) {
this.ruleInstanceId = ruleInstanceId;
}
public Long getRuleId() {
return ruleId;
}
public void setRuleId(Long ruleId) {
this.ruleId = ruleId;
}
public String getRuleInstanceGroup() {
return ruleInstanceGroup;
}
public void setRuleInstanceGroup(String ruleInstanceGroup) {
this.ruleInstanceGroup = ruleInstanceGroup;
}
public Long getSchemaInstanceId() {
return schemaInstanceId;
}
public void setSchemaInstanceId(Long schemaInstanceId) {
this.schemaInstanceId = schemaInstanceId;
}
public Long getDeskId() {
return deskId;
}
public void setDeskId(Long deskId) {
this.deskId = deskId;
}
public Long getSourceSystemId() {
return sourceSystemId;
}
public void setSourceSystemId(Long sourceSystemId) {
this.sourceSystemId = sourceSystemId;
}
public Integer getSeverity() {
return severity;
}
public void setSeverity(Integer severity) {
this.severity = severity;
}
public boolean isActiveFlag() {
return activeFlag;
}
public boolean getActiveFlag() {
return activeFlag;
}
public void setActiveFlag(boolean activeFlag) {
this.activeFlag = activeFlag;
}
}
listRuleInstances.jsp
=================
<h:dataTable id="listRuleInstancesTable"
value="#{listRuleInstancesBean.ruleInstanceList}"
binding="#{listRuleInstancesBean.ruleInstanceTable}"
var="ruleInstanceRow"
headerClass="DashPartTitle"
rowClasses="DashPartBody"
cellspacing="0"
cellpadding="2"
frame="border"
rules="all">
<h:column>
<f:facet name="header">
<h:outputText value="Rule Instance Id"/>
</f:facet>
<h:outputText value="#{ruleInstanceRow.ruleInstanceId}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Rule Instance Group"/>
</f:facet>
<h:outputText value="#{ruleInstanceRow.ruleInstanceGroup}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Severity"/>
</f:facet>
<h:outputText
value="ERROR"
rendered="#{ruleInstanceRow.severity == '0'}"/>
<h:outputText
value="WARN"
rendered="#{ruleInstanceRow.severity == '1'}"/>
<h:outputText
value="INFO"
rendered="#{ruleInstanceRow.severity == '2'}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Active"/>
</f:facet>
<h:outputText
value="Yes"
rendered="#{ruleInstanceRow.activeFlag == 'true'}"/>
<h:outputText
value="No"
rendered="#{ruleInstanceRow.activeFlag == 'false'}"/>
</h:column>
</h:dataTable>
I have other dataTable's in my application, all of which follow the exact same
pattern as this, and all of which work correctly. Thinking that there might
have been a problem connecting the JSP page to the backing bean, I changed the
getAllRuleInstances() method above to return a List of different classes, and
changed the column references in the dataTable to the different class, and the
dataTable worked correctly. This tells me that MyFaces may have a problem with
the RuleInstance class, but without more detailed exception information I can't
see what that might be.
Just to clarify, I am using JDK 1.4.2. I have seen a dataTable example that
used a paramaterized List ( List<...> ) to tell Java what class each element
would be an instance of, which might aid MyFaces in displaying the dataTable. I
understand that paramaterized types are only supported in JDK 1.5+, so I cannot
go down this path.
This problem seems to defy logic, and I have been beating my head against the
wall trying to solve it. Is there something hidden away that can cause a
dataTable to throw this exception for no apparent reason?
Any ideas? I appreciate any time you can spend looking at this, so thanks in
advance.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira