Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
1.1.9
-
None
-
Mac OS 10.5.8
JDK 1.6.0
Mojarra 2.0.0-SNAPSHOT
Glassfish V3
Description
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)
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.