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 
Daan
  • 23
  • 4

1 Answers1

0

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).

Daan
  • 23
  • 4
  • Hi Daan, just wondering, why do you think GlassFish 6.25 uses JSF 2.2? I mean, where did you find a reference to it? I put Mojarra 3.0.1 in GlassFish 6.2.5, which implements Jakarta Faces 3.0. See https://github.com/eclipse-ee4j/glassfish/blob/6.2.5-BRANCH/appserver/pom.xml#L93 – Arjan Tijms May 14 '22 at 15:39
  • @ArjanTijms I simply checked programmatically with a print like here [link](https://stackoverflow.com/a/47411384/13550062), I downloaded standalone glassfish from the official website and did not modify anything. – Daan May 14 '22 at 16:13
  • I swapped to payara after this and there JSF 3.0 works like a charm – Daan May 14 '22 at 16:19
  • This does not provide an answer to the question. To critique or request clarification from an author, leave a comment below their post. - [From Review](/review/low-quality-posts/31779114) – Skatox May 15 '22 at 17:01
  • 1
    @Skatox, I tried to clarify it with an edit – Daan May 15 '22 at 17:29