I asked this in the past and was told, that 2026.Q01 will have Jakarta Faces support for portlet released together with it. Unless I’m missing something obvious, that was not the case.
So is there a timeline when Jakarta Faces support will come?
Thank you!
Liferay JSF for Jakarta is already available.
While we finalize the documentation, check out the sample PrimeFaces portlet that uses Jakarta.
Thanks for the pointer. After I fixed the dependency list of the sample I managed to compile it. But if fails to runtime. I get:
2026-04-19 12:06:09.051 ERROR [http-nio-8080-exec-1][header_portlet_jsp:122] /WEB-INF/views/applicant.xhtml @34,52 <f:validateRegex> Parent not an instance of EditableValueHolder: jakarta.faces.component.html.HtmlForm@5a193d38
jakarta.faces.view.facelets.TagException: /WEB-INF/views/applicant.xhtml @34,52 <f:validateRegex> Parent not an instance of EditableValueHolder: jakarta.faces.component.html.HtmlForm@5a193d38
at com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl.applyNested(ValidatorTagHandlerDelegateImpl.java:214) ~[?:?]
at com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl.apply(ValidatorTagHandlerDelegateImpl.java:65) ~[?:?]
at jakarta.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:111) ~[?:?]
at jakarta.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:55) ~[?:?]
at jakarta.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:55) ~[?:?]
at jakarta.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) ~[?:?]
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:179) ~[?:?]
at jakarta.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:111) ~[?:?]
It also looks very fishy. There is a dependency “jakarta.faces” with a version 2.3. That can’t be correct as Jakarta Faces is still in the javax.* namespace and Jakarta Server Faces is the first version switching namespace and current is 4.0.
The same applies to the three patched dependencies (JSF API, Implementation and Primefaces).
Maybe the documentation will shed some light onto the complete plan.
This is expected. Faces started supporting Jakarta namespaces in 2.3, not just in 4.0.
To simplify the migration to Lifeary DXP on Jakarta, we are using a Jakarta-compatible version of Faces 2.3 for Liferay DXP.
Are there specific features of Jakarta Faces 4.0 you need for your project?
Sorry, I just noticed that version numbers were partially missing from my text. To be more concrete:
My understanding is, that Jakarta Server Faces 2.3 is a rerelease of JSR372 (Java Server Faces 2.3) with the eclipse foundation specification license, nothing more. So that version is still in the javax.* Namespace. (see: Jakarta Server Fages API documentation)
3.0 (not 4.0) is the Jakarta Server Faces version that switched to jakarta.*. (see: Jakarta Server Faces )
As this currently does not render (see exception) I can only speculate how it will turn out in reality.
The error you are getting looks related to the tag formatting
Reported pattern in your applicant.xhtml:
<h:form>
<f:validateRegex pattern=“…” />
</h:form>
Correct Format (Nested under an input):
<h:form>
<h:inputText value=“#{bean.value}”>
<f:validateRegex pattern=“…” />
</h:inputText>
</h:form>
The stack trace is from the demo project you referenced. To be concrete it is here:
This is a validator inside the primefaces inputtext field. From a quick look the code I see in the project makes sense.
I patched the project like this (com.liferay.faces.util is required for the loggers):
diff --git a/demo/primefaces-applicant-portlet/pom.xml b/demo/primefaces-applicant-portlet/pom.xml
index 2354d65ec..0ac884b7d 100644
--- a/demo/primefaces-applicant-portlet/pom.xml
+++ b/demo/primefaces-applicant-portlet/pom.xml
@@ -87,6 +87,10 @@
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
</dependency>
- </dependencies>
+ <dependency>
+ <groupId>com.liferay</groupId>
+ <artifactId>com.liferay.faces.util</artifactId>
+ </dependency>
+ </dependencies>
</project>
and then build the project with mvn clean package.
I tested with the demo to confirm it deploys successfully on 2026.Q1
In the pom.xml I just needed to add 5.0.0 version
<dependency>
<groupId>com.liferay</groupId>
<artifactId>com.liferay.faces.util</artifactId>
<version>5.0.0</version>
</dependency>
Make sure to update your versions to the latest from our repository
e.g. Index of /repositories/liferay-public-releases/com/liferay/com.liferay.faces.util/5.0.0
Thank your for taking time to test. So I restartet from scratch and it does indeed seem to work. I think I screwed up building the portlets with the proper profiles (mvn clean package -P liferay,mojarra,tomcat).
Both the jsf-applicant-portlet and primefaces-applicant-portlet seem to work correctly. The jsf-showcase-portlet loads, but the accordions don’t work.
For a few of the problems I found, I pushed PRs:
For the alloy showcase I built from GitHub - liferay/liferay-faces-alloy · GitHub. The mvn call had to be modified to mvn -Dbnd.baseline.fail.on.missing=false install to skip the OSGI baseline check.
@Victor_Ware are Thin Wars also supported already in 2026.q1? When I tried deploying the newest versions of the jsf artifacts we used in 2025.q1 the were still using javax at some points.
The artifacts we used were
At least jakarta faces is using javax as you stated in an earlier response but i could not find a osgi ready implementation of jakarta faces 4.x in the liferay mvn repository that could have been placed in the osgi modules as standalone module.
Yes, Thin WAR is supported on 2026.Q1, but it still uses JSF 2.3.
Liferay’s approach is JSF 2.3 under Jakarta namespace. We do not support Jakarta Faces 4.x on DXP currently. This is intentional to keep behavior changes minimal while moving from javax.* → jakarta.*.
If you’re seeing javax.* at runtime, check for a mixed set of artifacts or if they are javax packages that are still part of Java SE.
You might also need 2 additional JARs depending on your usage
portal tags: com.liferay.faces.portal-7.0.0.jar
alloy tags: com.liferay.faces.alloy-5.0.0.jar
@Jan_Binder Also make sure you are using the Jakarta versions of the Liferay patched jars:
jakarta.faces-2.3.21.LIFERAY-PATCHED-4.JAKARTA-LIFERAY-PATCHED-1.jar
org.primefaces-15.0.6.LIFERAY-PATCHED-3.JAKARTA-LIFERAY-PATCHED-1.jar
@Victor_Ware Thank you for your answers! I’ve got the Thin Wars working with those versions and the com.liferay.jakarta.portlet.api-4.0.0.jar.
I also needed to to change one package additional to the javax → jakarta change as the javax.portlet.faces moved to com.liferay.faces but after that the portlets ran.