You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus 2.x搭配Apache MyFaces使用WebSocket连接失败如何解决

Quarkus 2.x与MyFaces 2.3-next-M6适配WebSocket功能解决方案

问题核心根因为Quarkus 2.x的WebSocket容器初始化逻辑与MyFaces 2.3版本的ServerContainer查找逻辑不兼容,Quarkus默认没有将JSR-356标准的ServerContainer实例暴露到Servlet上下文中,导致MyFaces无法识别可用的WebSocket服务。

可行解决方案

方案一:使用Quarkus官方适配的MyFaces扩展(推荐)

  • 替换原有MyFaces依赖为Quarkus 2.x平台对应的quarkus-myfaces扩展,该扩展已默认完成WebSocket相关适配,无需额外配置
  • 依赖调整示例(Maven):
<dependency>
    <groupId>io.quarkus.platform</groupId>
    <artifactId>quarkus-myfaces</artifactId>
    <version>2.16.12.Final</version> <!-- 与你使用的Quarkus 2.x版本保持一致 -->
</dependency>
  • 同时移除项目中单独引入的org.apache.myfaces:myfaces-impl、org.apache.myfaces:myfaces-api依赖,避免版本冲突

方案二:手动注册ServerContainer(适用于必须保留MyFaces 2.3-next-M6版本的场景)

  1. 首先在application.properties中开启Undertow WebSocket支持:
quarkus.undertow.websockets-enabled=true
  1. 新增Servlet上下文监听器,将Quarkus托管的ServerContainer实例暴露到Servlet上下文供MyFaces读取:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.websocket.server.ServerContainer;
import io.quarkus.arc.Arc;

@WebListener
public class WebsocketContainerRegistrar implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServerContainer serverContainer = Arc.container().instance(ServerContainer.class).get();
        sce.getServletContext().setAttribute("javax.websocket.server.ServerContainer", serverContainer);
    }
}
  1. 排查依赖冲突,确保项目中所有WebSocket相关依赖均为javax.websocket命名空间版本,不要引入jakarta.websocket相关依赖,避免类加载冲突。

验证方式

启动Quarkus服务后,若启动日志中不再出现f:websocket support enabled but cannot found websocket ServerContainer instance on current context提示,即代表配置生效,前端WebSocket连接即可正常建立。

内容的提问来源于stack exchange,提问作者DelMar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:06:01