基于JoinFaces与Spring Boot 3的JSF应用启动报错:CDI不可用
JoinFaces + Spring Boot 3 重构问题解决指南
一、Undertow Starter 选择建议
- 优先使用
org.joinfaces:undertow-spring-boot-starter 5.3.13:这个Starter是JoinFaces专门为JSF集成优化的,和你当前用的jsf-spring-boot-starter 5.3.13版本完全对齐,能自动处理JSF与Undertow的适配细节,避免版本兼容问题。 - 若选择Spring官方的
org.springframework.boot:spring-boot-starter-undertow 3.3.12:虽然也能正常运行,但需要自行确保Spring Boot版本(3.3.x)与JoinFaces版本(5.3.x)的兼容性,不过当前两者版本是匹配的,只是缺少JoinFaces针对JSF的额外配置优化。
二、CDI不可用报错的解决方法
报错根源是GlassFish Faces(org.glassfish:jakarta.faces 4.1.4)默认会尝试初始化CDI上下文,而你明确不想使用CDI,需要通过配置和依赖调整来解决:
禁用JSF的CDI支持
在application.properties中添加以下配置:jakarta.faces.CDI_ENABLED=false该配置会直接告诉GlassFish Faces不要尝试获取CDI BeanManager,从根源避免报错。
清理依赖冲突
- 移除手动引入的
jakarta.faces:jakarta.faces-api 4.0.1:jsf-spring-boot-starter已经内置了适配版本的JSF API,手动引入不同版本会导致API与实现版本不匹配(你当前API是4.0.1,实现是4.1.4),引发潜在问题。 - 检查依赖树,确保没有意外引入CDI相关依赖(如
jakarta.enterprise:jakarta.enterprise.cdi-api或Weld等CDI实现),如果有,通过<exclusions>标签排除。
- 移除手动引入的
确认Spring接管依赖注入
JoinFaces默认会让Spring容器处理JSF Bean的依赖注入,只要禁用了JSF的CDI支持,Spring就能自动接管,无需额外配置。
内容的提问来源于stack exchange,提问作者Pascal Petruch
相关产品推荐
相关产品推荐

