Spring Boot 2.5.5整合PrimeFaces 10报错JspFactory缺失,缺少哪些依赖配置?
问题根因
报错java.lang.NoClassDefFoundError: javax/servlet/jsp/JspFactory是Mojarra(JSF实现)初始化阶段检测JSP版本时,缺失JSP核心类导致的,触发原因有两点:
- 你将
spring-boot-starter-tomcat的scope设为provided,本地运行嵌入式Tomcat时,该依赖不会被加载,其内置的JSP核心包tomcat-embed-jasper也随之缺失 - JSF 2.2默认会强制检测JSP环境,即使你全量使用XHTML+Facelets完全不用JSP,该版本的Mojarra依然会执行这个校验逻辑
修复方案
1. 依赖修复(二选一即可)
方案A:保留JSP支持适配本地调试
如果需要本地直接运行启动类调试,或者需要用到JSP功能,补充JSP核心依赖即可:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <!-- 若你的spring-boot-starter-tomcat保留provided scope,此处也设为provided即可 --> </dependency>
方案B:关闭JSP检测无需新增依赖
如果你全用Facelets不需要JSP支持,直接在现有初始化参数中新增配置关闭JSP校验即可:
找到你启动类中servletContext.setInitParameter的位置,新增两行配置:
servletContext.setInitParameter("com.sun.faces.forceLoadConfiguration", Boolean.TRUE.toString()); // 新增以下两行 servletContext.setInitParameter("javax.faces.FACELETS_SKIP_COMMENTS", "true"); servletContext.setInitParameter("com.sun.faces.disableJsp", "true");
2. 可选WAR包适配
如果你需要将项目打成WAR包部署到外部Tomcat,还需要修改启动类继承SpringBootServletInitializer,重写配置方法:
@SpringBootApplication public class CcmtApplication extends SpringBootServletInitializer { protected CcmtApplication() { } public static void main(String[] args) { SpringApplication.run(CcmtApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(CcmtApplication.class); } // 原有jsfServletRegistration、mojarraConfigureListener的Bean定义保持不变 }
内容的提问来源于stack exchange,提问作者pillesoft
相关产品推荐
相关产品推荐

