omnifaces / optimusfaces

Utility library for OmniFaces + PrimeFaces combined

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

PrimeFaces X Compatibility

mydeadlyvenoms opened this issue · comments

Since PrimeFaces released the first release candidate of the upcoming PrimeFaces X version it would be awesome to make it compatible with OptimusFaces. According to the release notes and the migration guide they implemented a few changes that impact the handling of DataTables.

Coincidentally I was already working on it today: 6709f09

All ITs currently already pass with OmniFaces 4.0-M4 and PrimeFaces 10.0.0-RC1 on WildFly 22.0.0.Final :)

Yeeeyy, thank you very much!

@BalusC according to the latest Jakarta EE 9 / Java 11 confusion I wanted to ask if you plan to backport the PrimeFaces X support of OptimusFaces to Java EE 8 / Jakarta EE 8 and maybe Java 8?

Yes, good point. PrimeFaces X has indeed also a JEE8 variant.

@BalusC please let me know if I can assist you during the tests. I have some advanced use cases of OptimusFaces and can perform some end to end tests.

Sorry, forgot to tell, I've already prepped a 0.15-SNAPSHOT 3 days ago.

0b15ed0

Give it a try.

No issues using the latest snapshot. Cool!

Hi @BalusC
I've been testing your SNAPSHOT since a few days now and the following Exception seems to appear from time to time.
Does that mean anything to you?

FullAjaxExceptionHandler: An exception occurred during rendering JSF ajax response. Error page '/error.xhtml' will be shown.
javax.faces.FacesException: No column with field 'id' has been found
	at org.primefaces.component.api.UITable.lambda$updateSortByWithUserSortBy$6(UITable.java:373)
	at java.base/java.util.Optional.orElseThrow(Optional.java:408)
	at org.primefaces.component.api.UITable.updateSortByWithUserSortBy(UITable.java:373)
	at org.primefaces.component.api.UITable.initSortBy(UITable.java:334)
	at org.primefaces.component.datatable.DataTable.lambda$getSortByAsMap$1(DataTable.java:1024)
	at org.primefaces.util.ComponentUtils.computeIfAbsent(ComponentUtils.java:500)
	at org.primefaces.component.datatable.DataTable.getSortByAsMap(DataTable.java:1024)
	at org.primefaces.component.api.UITable.getActiveSortMeta(UITable.java:400)
	at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:459)
	at org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:127)
	at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:94)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:595)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1654)
	at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:615)
	at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:159)
	at org.primefaces.component.api.UIData.visitTree(UIData.java:683)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at javax.faces.component.UIForm.visitTree(UIForm.java:355)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:400)
	at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:319)
	at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:65)
	at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:228)
	at org.omnifaces.context.OmniPartialViewContext.processPartial(OmniPartialViewContext.java:122)
	at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1102)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1647)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:442)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:170)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132)
	at org.omnifaces.viewhandler.OmniViewHandler.renderView(OmniViewHandler.java:155)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:102)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:76)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:199)
	at javax.faces.webapp.FacesServlet.executeLifecyle(FacesServlet.java:708)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:451)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1636)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:331)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.omnifaces.filter.FacesExceptionFilter.doFilter(FacesExceptionFilter.java:133)
	at org.omnifaces.filter.FacesExceptionFilter.doFilter(FacesExceptionFilter.java:117)
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.glassfish.tyrus.servlet.TyrusServletFilter.doFilter(TyrusServletFilter.java:282)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at ...
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at ...
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.omnifaces.filter.GzipResponseFilter.doFilter(GzipResponseFilter.java:181)
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.omnifaces.facesviews.FacesViewsForwardingFilter.filterExtensionLessToExtension(FacesViewsForwardingFilter.java:180)
	at org.omnifaces.facesviews.FacesViewsForwardingFilter.filterExtensionLess(FacesViewsForwardingFilter.java:137)
	at org.omnifaces.facesviews.FacesViewsForwardingFilter.filterExtensionLess(FacesViewsForwardingFilter.java:123)
	at org.omnifaces.facesviews.FacesViewsForwardingFilter.doFilter(FacesViewsForwardingFilter.java:84)
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:757)
	at org.apache.catalina.core.StandardPipeline.doChainInvoke(StandardPipeline.java:581)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:158)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:520)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:217)
	at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:200)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:569)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:549)
	at java.base/java.lang.Thread.run(Thread.java:834)
]] 

I tried the official PrimeFaces X release, the issue seems to persist.

Hi @BalusC do you have any plans regarding the official PrimeFaces X support? Until now the exception listed above is the only thing that seems to occur from time to time.

Sorry for the delay! I'll take a closer look this weekend.

Yup, nailed down it. I knew this outcommented line in the IT was a silent hint: 0b15ed0#diff-520bbe2e98ba518fc8b345d583b74794dd01dc80664206ca284ba0ed5f32f838R1301

It has been fixed and the outcommented line has been restored and all tests now pass: c548b3c#diff-520bbe2e98ba518fc8b345d583b74794dd01dc80664206ca284ba0ed5f32f838R1301

In the end it turns out that the default sort order is expected to be already initialized BEFORE LazyDataModel#load() method is invoked. Previously it was initialized DURING LazyDataModel#load() only, but that worked fine in previous PrimeFaces versions.

Please retry and let me know.

Thank you very much for your effort. Unfortunately the exception seems to persist. :-(

javax.faces.FacesException: No column with field 'id' has been found
	at org.primefaces.component.api.UITable.lambda$updateSortByWithUserSortBy$6(UITable.java:376)
	at java.base/java.util.Optional.orElseThrow(Optional.java:408)
	at org.primefaces.component.api.UITable.updateSortByWithUserSortBy(UITable.java:376)
	at org.primefaces.component.api.UITable.initSortBy(UITable.java:337)
	at org.primefaces.component.datatable.DataTable.lambda$getSortByAsMap$1(DataTable.java:1026)
	at org.primefaces.util.ComponentUtils.computeIfAbsent(ComponentUtils.java:512)
	at org.primefaces.component.datatable.DataTable.getSortByAsMap(DataTable.java:1026)
	at org.primefaces.component.api.UITable.getActiveSortMeta(UITable.java:403)
	at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:459)
	at org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:126)
	at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:93)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:595)
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:85)
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:67)
	at org.primefaces.component.outputpanel.OutputPanelRenderer.encodeEnd(OutputPanelRenderer.java:45)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:595)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1654)
	at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:615)
	at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:159)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1456)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at javax.faces.component.UIForm.visitTree(UIForm.java:355)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
	at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:400)
	at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:319)
	at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:65)
	at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:228)
	at org.omnifaces.context.OmniPartialViewContext.processPartial(OmniPartialViewContext.java:122)
	at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1102)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1647)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:442)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:170)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132)
	at org.omnifaces.viewhandler.OmniViewHandler.renderView(OmniViewHandler.java:155)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:102)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:76)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:199)
	at javax.faces.webapp.FacesServlet.executeLifecyle(FacesServlet.java:708)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:451)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1636)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:331)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.omnifaces.filter.FacesExceptionFilter.doFilter(FacesExceptionFilter.java:133)
	at org.omnifaces.filter.FacesExceptionFilter.doFilter(FacesExceptionFilter.java:117)
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.glassfish.tyrus.servlet.TyrusServletFilter.doFilter(TyrusServletFilter.java:282)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
...
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.omnifaces.filter.GzipResponseFilter.doFilter(GzipResponseFilter.java:183)
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.omnifaces.facesviews.FacesViewsForwardingFilter.filterExtensionLessToExtension(FacesViewsForwardingFilter.java:180)
	at org.omnifaces.facesviews.FacesViewsForwardingFilter.filterExtensionLess(FacesViewsForwardingFilter.java:137)
	at org.omnifaces.facesviews.FacesViewsForwardingFilter.filterExtensionLess(FacesViewsForwardingFilter.java:123)
	at org.omnifaces.facesviews.FacesViewsForwardingFilter.doFilter(FacesViewsForwardingFilter.java:84)
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:757)
	at org.apache.catalina.core.StandardPipeline.doChainInvoke(StandardPipeline.java:581)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:158)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:520)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:217)
	at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:200)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:569)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:549)
	at java.base/java.lang.Thread.run(Thread.java:834)
]]

Yikes.

Haven't you yet been able to boil down a reproducer? I'll take a second look.

I gave it another try using the current PrimeFaces 12.0.0-RC2 dependency and a similar exception occured.

javax.faces.FacesException: No column with field 'id' or columnKey 'null' has been found
...

I found out that it appears as soon as the datatable does not contain the ID column.

I.e., <op:column field="id" head="#{text['label.id']}"/> is missing. I hope this can serve as a small / easy reproducer.

Sorry @BalusC I totally missed this issue. :-(

PrimeFaces 11 in combination with <op:column field="id" head="#{text['label.id']}" visible="false"/> works fine, can be closed. :-)