JSF< f:websocket>连接失败(Jakarta EE9,JSF 3.0)
我正在尝试使用Jakarta EE9和JSF 3.0在Glassfish 6.2.5服务器上使用Jakarta EE9和JSF 3.0的简单Websocket应用程序。当我运行它时,未收到消息,当服务器关闭以下时,在Web控制台中打印了以下内容:
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
我的XHTML如下:
<!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>
我使用以下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");
}
}
我的faces-config是这样的:
<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>
和web-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>
有人知道如何解决这个问题吗?我尝试添加一个fackendpoint,例如推荐在这里,但随后我得到以下错误:
Cannot invoke "jakarta.servlet.FilterRegistration$Dynamic.setAsyncSupported(boolean)" because "reg" is null
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我没有意识到Glassfish 6.2.5仍然使用JSF 2.2
编辑
经过一些抱怨后,我对我进行了详细的调查。
我在此处下载了Glassgfish 6.2.5(
[Eclipse Glassfish 6.2.5,Jakarta EE平台,9.1] [1]
)。执行下面的代码时,发现在这里:我获得了JSF版本2.2。
深入研究Glassfish的源代码后,还可以发现以下文件中使用了2.2版:
在此.jar中可以找到以下文件:jsf.js, which is version 2.2。
但是,正如@arjantijms所指出的那样,在pom.xml文件中,可以发现它确实使用了3.0.1版。
总之,我不知道实际上出了什么问题,版本或其他东西。同一代码在Payara上运行良好(我现在正在使用)。
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: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:
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.
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).