PrimeFaces Push已废弃,改用JSF 2.3 <f:websocket>遇异常求助
<f:websocket>在WildFly 11上的页面异常问题 我之前在WildFly 11上迁移JSF 2.3 websocket的时候也踩过不少坑,结合你的情况,给你梳理几个关键排查点:
确认WildFly 11优先使用你部署的JSF 2.3 JAR
WildFly 11默认自带的是JSF 2.2版本,就算你自己打包了JSF 2.3的JAR到项目里,服务器可能还是会优先加载自带的旧版本。解决方法是在项目的WEB-INF目录下创建jboss-deployment-structure.xml,排除自带的JSF子系统:<jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="jsf" /> </exclude-subsystems> <dependencies> <module name="javax.api" /> <module name="javax.servlet.api" /> <module name="javax.servlet.jsp.api" /> <module name="javax.el.api" /> </dependencies> </deployment> </jboss-deployment-structure>检查web.xml的核心配置是否齐全
JSF 2.3的websocket需要几个关键配置才能正常工作,别漏了:<!-- 明确指定JSF版本为2.3 --> <context-param> <param-name>javax.faces.VERSION</param-name> <param-value>2.3</param-value> </context-param> <!-- 启用websocket端点 --> <context-param> <param-name>javax.faces.ENABLE_WEBSOCKET_ENDPOINT</param-name> <param-value>true</param-value> </context-param> <!-- 确保FacesServlet映射包含websocket的路径 --> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>*.xhtml</url-pattern> <url-pattern>/javax.faces.push/*</url-pattern> </servlet-mapping>这里的
/javax.faces.push/*映射非常关键,websocket的握手请求会走这个路径,没配置的话直接会404或者抛出初始化异常。核对页面与后端Bean的channel匹配
页面上的<f:websocket>的channel属性必须和后端Bean里@Push注解的channel完全一致,大小写敏感:
后端Bean示例:@Named @ApplicationScoped public class PushNotificationBean { @Inject @Push(channel="userNotifications") private PushContext pushContext; public void sendToUsers(String message) { pushContext.send(message); } }页面组件:
<f:websocket channel="userNotifications" onmessage="processNotification" /> <script> function processNotification(message) { alert('收到推送:' + message); } </script>查看服务器日志的具体异常栈
你说访问页面出现异常,但没给出具体错误信息。比如如果是ClassNotFoundException: javax.faces.webapp.FacesWebSocketServlet,那就是JSF 2.3的JAR没被正确加载;如果是IllegalStateException: WebSocket endpoint is not enabled,那就是ENABLE_WEBSOCKET_ENDPOINT参数没配置对。把日志里的完整异常信息找出来,能更快定位问题。确认JDK版本符合要求
JSF 2.3要求至少使用JDK 8,WildFly 11虽然支持JDK 8,但如果你的项目编译或运行时用的是JDK 7及以下,肯定会出现兼容性问题。
如果按上面的步骤排查后还是有问题,把具体的异常信息贴出来,我再帮你分析!
内容的提问来源于stack exchange,提问作者kaiser

