'JSF <f:websocket> connection fails (Jakarta EE9, JSF 3.0)
I am trying a simple websocket application using Jakarta EE9 and JSF 3.0 on a glassfish 6.2.5 server. When I run it, messages are not received, when the server shuts down the following is printed in the web console:
WebSocket connection to 'ws://localhost:8080/folder/jakarta.faces.push/someChannel?c10aaeaa-2007-4a19-96bb-630f88285f6c' failed:
t.open @ jsf.js.xhtml?ln=jakarta.faces:1
My xhtml is the following:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
</h:head>
<h:body>
<div class="Home-Page">
<div class="Home-window">
<h:commandButton
id="sendMessage"
type="submit"
action="#{msgBean.sendMessage()}" value="Send Message">
<f:ajax />
</h:commandButton>
<f:websocket channel="someChannel" onmessage="function test(m){console.log(m);}" >
</f:websocket>
</div>
</div>
</h:body>
</html>
And I use the following bean:
import jakarta.faces.push.Push;
import jakarta.faces.push.PushContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
@Named("msgBean")
@ViewScoped
public class MsgBeanimplements java.io.Serializable{
@Inject
@Push
private PushContext someChannel;
public void sendMessage() {
someChannel.send("hello");
}
}
My faces-config is like this:
<faces-config
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-facesconfig_3_0.xsd"
version="3.0">
</faces-config>
And web-config:
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<context-param>
<param-name>jakarta.faces.ENABLE_CDI_RESOLVER_CHAIN</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>jakarta.faces.ENABLE_WEBSOCKET_ENDPOINT</param-name>
<param-value>true</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
Does anyone know how to solve this? I have tried adding a FakeEndPoint like recommended here, but then I get the following error:
Cannot invoke "jakarta.servlet.FilterRegistration$Dynamic.setAsyncSupported(boolean)" because "reg" is null
Solution 1:[1]
I did not realize glassfish 6.2.5 still uses JSF 2.2
EDIT
I investigated in more detail after some complaints.
I downloaded Glassgfish 6.2.5 here ([Eclipse GlassFish 6.2.5, Jakarta EE Platform, 9.1][1]
). When executing the code below found here:
System.out.println("JSF API Location: " + FacesContext.class.getProtectionDomain().getCodeSource());
System.out.println("JSF Impl Location: " + Facelet.class.getProtectionDomain().getCodeSource());
I get JSF version 2.2.
After a dive in the source code of glassfish, it can also be found that version 2.2 is being used in the following files:
\glassfish-6.2.5\glassfish6\glassfish\modules\jakarta.faces.jar
In this .jar the following file can be found: jsf.js, which is version 2.2.
However as @ArjanTijms pointed out, in the pom.xml file, it can be found that it does use version 3.0.1.
glassfish-6.2.5\glassfish6\glassfish\modules\jakarta.faces.jar\META-INF\maven\org.glassfish\jakarta.faces\
<groupId>org.glassfish</groupId>
<artifactId>jakarta.faces</artifactId>
<version>3.0.1</version>
In conclusion, I have no idea what is actually going wrong, the version or something else. The same code runs fine on Payara (which I am using now).
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |