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

Most upvoted comments

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 a ListDataModel by default. If you can elaborate your scenario that might explain why your lazydatamodel is null, maybe we can do something about it