Spring Boot集成Weld后引入Omnifaces 2.6启动失败求助
问题分析与解决方案
你遇到的核心问题是JSF初始化流程过早触发了OmniFaces对CDI容器的访问,而此时Weld还未完成启动,导致抛出Singleton not set for STATIC_INSTANCE异常。从栈追踪可以看到:JSF在初始化ClientWindowFactoryImpl时需要创建Application实例,OmniFaces的OmniApplication会尝试通过CDI.current()获取Weld容器,但此时Weld的Singleton实例还未初始化完成,最终引发连锁异常。
下面提供几种针对性的解决方案:
方案1:调整Listener初始化顺序,让Weld先于JSF启动
在Spring Boot中,我们可以手动注册Weld的初始化Listener,并设置它的优先级高于JSF的ConfigureListener,确保CDI容器在OmniFaces访问前就已就绪。
创建一个Spring配置类:
import org.jboss.weld.environment.servlet.listener.WeldInitialListener; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; @Configuration public class WeldInitializerConfig { @Bean public ServletListenerRegistrationBean<WeldInitialListener> weldInitialListener() { ServletListenerRegistrationBean<WeldInitialListener> registrationBean = new ServletListenerRegistrationBean<>(); registrationBean.setListener(new WeldInitialListener()); // 设置最高优先级,保证Weld先完成初始化 registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; } }
方案2:升级OmniFaces版本
OmniFaces 2.6.x虽然兼容CDI 2.0,但后续的2.x版本(如2.14.0)针对Spring Boot+Weld的场景做了初始化逻辑优化,可能直接解决这个顺序问题。
修改POM中的OmniFaces依赖:
<dependency> <groupId>org.omnifaces</groupId> <artifactId>omnifaces</artifactId> <version>2.14.0</version> <!-- 兼容JSF 2.2的最新2.x版本 --> </dependency>
方案3:使用JoinFaces官方的Weld集成 starter
你当前手动引入weld-servlet-shaded,而JoinFaces提供了专门的Weld集成starter,它会自动处理CDI容器与JSF的初始化顺序,无需手动配置Listener。
- 移除POM中手动添加的
weld-servlet-shaded依赖 - 加入JoinFaces的Weld starter:
<dependency> <groupId>org.joinfaces</groupId> <artifactId>weld-spring-boot-starter</artifactId> </dependency>
验证步骤
- 执行
mvn clean install清理并重新构建项目 - 启动Spring Boot应用,检查是否还存在
ClientWindowFactory相关异常 - 验证JSF页面、Jersey接口以及OmniFaces的功能是否正常运行
内容的提问来源于stack exchange,提问作者Josep M Beleta
相关产品推荐
相关产品推荐

