primefaces: DataTable: ClassCastException when DataTable is lazy and value is null
Describe the bug
I get a ClassCastException with Primefaces 13 when the value of a lazy DataTable is null.
When the value is null getDataModel()
returns an empty ListDataModel
which is not a lazy model type.
This worked with Primefaces 12 and before.
java.lang.ClassCastException: class javax.faces.model.ListDataModel cannot be cast to class org.primefaces.model.LazyDataModel (javax.faces.model.ListDataModel and org.primefaces.model.LazyDataModel are in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @1687eb01)
at org.primefaces.component.datatable.DataTable.getLazyDataModel(DataTable.java:1209) ~[primefaces-13.0.0.jar:13.0.0]
at org.primefaces.component.datatable.DataTable.loadLazyDataIfEnabled(DataTable.java:477) ~[primefaces-13.0.0.jar:13.0.0]
at org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:126) ~[primefaces-13.0.0.jar:13.0.0]
at org.primefaces.component.datatable.DataTableRenderer.render(DataTableRenderer.java:103) ~[primefaces-13.0.0.jar:13.0.0]
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:96) ~[primefaces-13.0.0.jar:13.0.0]
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:600) ~[jakarta.faces-2.3.18.jar:2.3.18]
at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:85) ~[primefaces-13.0.0.jar:13.0.0]
at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:67) ~[primefaces-13.0.0.jar:13.0.0]
at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:235) ~[primefaces-13.0.0.jar:13.0.0]
at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:144) ~[primefaces-13.0.0.jar:13.0.0]
at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:77) ~[primefaces-13.0.0.jar:13.0.0]
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:600) ~[jakarta.faces-2.3.18.jar:2.3.18]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655) ~[jakarta.faces-2.3.18.jar:2.3.18]
at javax.faces.render.Renderer.encodeChildren(Renderer.java:152) ~[jakarta.faces-2.3.18.jar:2.3.18]
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:571) ~[jakarta.faces-2.3.18.jar:2.3.18]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1648) ~[jakarta.faces-2.3.18.jar:2.3.18]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1651) ~[jakarta.faces-2.3.18.jar:2.3.18]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1651) ~[jakarta.faces-2.3.18.jar:2.3.18]
Reproducer
No response
Expected behavior
No response
PrimeFaces edition
Community
PrimeFaces version
13.0.0
Theme
No response
JSF implementation
Mojarra
JSF version
2.3
Java version
17
Browser(s)
No response
About this issue
- Original URL
- State: closed
- Created a year ago
- Comments: 18 (13 by maintainers)
Commits related to this issue
- #10371 — committed to primefaces/primefaces by tandraschko a year ago
- #10371 — committed to primefaces/primefaces by tandraschko a year ago
- Fix #10371 - DataTable: ClassCastException when DataTable is lazy and value is null — committed to Rapster/primefaces by Rapster a year ago
- Fix #10371 - DataTable: ClassCastException when DataTable is lazy and… (#10426) * Fix #10371 - DataTable: ClassCastException when DataTable is lazy and value is null * empty data model — committed to primefaces/primefaces by Rapster a year ago
- Fix #10371 13.0.3 DataTable: ClassCastException when DataTable is lazy — committed to melloware/primefaces by melloware 8 months ago
- Fix #10371 13.0.3 DataTable: ClassCastException when DataTable is lazy (#10934) — committed to primefaces/primefaces by melloware 8 months ago
https://github.com/primefaces/primefaces/blob/13.X/primefaces/src/main/java/org/primefaces/component/datatable/DataTable.java#L1211
This should already be enough, it was just refactored later
Therefor i asked if you have this issue in 13.0.1
I see, but I don’t think there is much to fix here except your scenario. It is by design that whenever value is null then
UIData#getDataModel
will return aListDataModel
by default. If you can elaborate your scenario that might explain why your lazydatamodel is null, maybe we can do something about it