ClassCastException when testing Tomahawk 1.1.9 table demos when
preserveDataModel="true"
----------------------------------------------------------------------------------------
Key: TOMAHAWK-1460
URL: https://issues.apache.org/jira/browse/TOMAHAWK-1460
Project: MyFaces Tomahawk
Issue Type: Bug
Components: Extended Datatable
Affects Versions: 1.1.9
Environment: Mac OS 10.5.8
JDK 1.6.0
Mojarra 2.0.0-SNAPSHOT
Glassfish V3
Reporter: Ryan Lubke
When executing 'Paged and Sortable', 'Master-Detail', and 'Optional
Header/Footer', a class cast exception is raised during post-back operations to
update the view.
java.lang.ClassCastException: javax.faces.model.ListDataModel cannot be cast to
org.apache.myfaces.component.html.ext._SerializableDataModel
at
org.apache.myfaces.component.html.ext.AbstractHtmlDataTable.updateModelFromPreservedDataModel(AbstractHtmlDataTable.java:493)
at
org.apache.myfaces.component.html.ext.AbstractHtmlDataTable.processUpdates(AbstractHtmlDataTable.java:479)
at
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1108)
at javax.faces.component.UIForm.processUpdates(UIForm.java:265)
at
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1108)
at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1238)
I've done some debugging here and have found this block of code being executed
during processRestoreState():
protected DataModel getDataModel()
{
if (_preservedDataModel != null)
{
setDataModel(_preservedDataModel);
_preservedDataModel = null;
}
return super.getDataModel();
}
The call stack at this point in time is:
at
org.apache.myfaces.component.html.ext.AbstractHtmlDataTable.getDataModel(AbstractHtmlDataTable.java:839)
at
org.apache.myfaces.component.html.ext.HtmlDataTableHack.setRowIndex(HtmlDataTableHack.java:282)
at
org.apache.myfaces.component.html.ext.AbstractHtmlDataTable.setRowIndex(AbstractHtmlDataTable.java:276)
at javax.faces.component.UIData.visitColumnsAndRows(UIData.java:1539)
at javax.faces.component.UIData.visitTree(UIData.java:1207)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1454)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1454)
at javax.faces.component.UIForm.visitTree(UIForm.java:333)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1454)
at
javax.faces.component.UIViewRoot.processRestoreState(UIViewRoot.java:868)
The interesting point here is that _preserveDataModel is set to null.
Later, during processUpdates(), updateModelFromPreservedDataModel() will
call getDataModel (as listed above), however, since _preservedDataModel was set
to null, the call is delegated to the super class, UIData, which returns
ListDataModel.
This change in the code path is new spec required functionality where
UIViewRoot.processRestoreState()
uses the TreeVisitor to notify components of the PostRestoreStateEvent. Given
this, I'm sure the
problem will be manifest with MyFaces 2.0.0.
WORKAROUND: set preservDataModel to false.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.