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

JoinFaces 5.4.4+Primefaces 15启动报错:缺失PreRenderComponentEvent类

问题:Spring Boot + Primefaces启动时出现ClassNotFoundException: javax.faces.event.PreRenderComponentEvent

离开Primefaces与JoinFaces数年后,我尝试使用最新版Spring Boot搭配Primefaces搭建Web应用。项目构建无报错,但启动时出现如下堆栈错误:

2025-04-12T19:39:47.793-04:00  INFO 253619 --- [  restartedMain] j.e.r.webcontainer.faces.application     : JSF1048: PostConstruct/PreDestroy annotations present.  ManagedBeans methods marked with these annotations will have said annotations processed.
jakarta.faces.FacesException: javax.faces.event.PreRenderComponentEvent
        at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:289)
        at com.sun.faces.config.processor.ApplicationConfigProcessor.addSystemEventListener(ApplicationConfigProcessor.java:755)
        at com.sun.faces.config.processor.ApplicationConfigProcessor.process(ApplicationConfigProcessor.java:277)
        at com.sun.faces.config.ConfigManager.lambda$initialize$0(ConfigManager.java:265)
        at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722)
        at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
        at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:263)
        at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:185)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4047)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4477)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749)
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:772)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749)
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:203)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:870)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:437)
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:128)
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:107)
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:517)
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:219)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:193)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:167)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:621)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350)
        at org.joinfaces.example.JarExampleApplication.main(JarExampleApplication.java:16)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.ClassNotFoundException: javax.faces.event.PreRenderComponentEvent
        at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.loadClass(TomcatEmbeddedWebappClassLoader.java:72)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1187)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:534)
        at java.base/java.lang.Class.forName(Class.java:513)
        at com.sun.faces.util.Util.loadClass(Util.java:372)
        at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:282)

我尝试过多种版本组合,但仍出现相同错误,说明存在根本性问题。恳请提供建议或解决方案!

我的build.gradle配置如下:

plugins {
    id "java"
    id 'org.springframework.boot' version '3.4.4'
    id 'application'
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // joinfaces
    implementation platform('org.joinfaces:joinfaces-platform:5.4.4')
    implementation 'org.joinfaces:primefaces-spring-boot-starter:5.4.4'
    implementation ('org.joinfaces:faces-spring-boot-starter:5.4.4') 

    // primefaces
    implementation 'org.primefaces:primefaces:15.0.3'
    implementation 'org.primefaces.extensions:primefaces-extensions:15.0.3'

    // jakarta EE
    implementation 'jakarta.platform:jakarta.jakartaee-web-api:10.0.0'
    implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0'
    implementation 'jakarta.faces:jakarta.faces-api:4.0.0'
    implementation 'org.glassfish:jakarta.faces:4.0.0'

    // spring boot
    implementation("org.springframework.boot:spring-boot-starter-web:3.4.4")
    implementation("org.springframework.boot:spring-boot-starter-validation:3.4.4")
    implementation("org.springframework.boot:spring-boot-devtools:3.4.4")
    testImplementation "org.springframework.boot:spring-boot-starter-test:3.4.4"

    // lombok
    implementation 'org.projectlombok:lombok:1.18.38'
}

tasks.named('test') {
    useJUnitPlatform()
}

解决方案

1. 核心问题定位

错误中的javax.faces.event.PreRenderComponentEvent是Java EE时代的旧包名,Jakarta EE 10(对应Spring Boot 3.x)已经将所有API迁移到jakarta.*包下。出现这个错误是因为依赖冲突,手动引入的重复依赖导致系统加载了旧的API路径。

2. 精简依赖配置

JoinFaces的Starter已经自动管理Primefaces、JSF实现(Mojarra)等依赖,不需要手动重复引入Jakarta EE API或JSF实现。修改dependencies部分如下:

dependencies {
    // JoinFaces 自动管理所有JSF/Primefaces依赖
    implementation platform('org.joinfaces:joinfaces-platform:5.4.4')
    implementation 'org.joinfaces:primefaces-spring-boot-starter:5.4.4'

    // Spring Boot 核心依赖
    implementation("org.springframework.boot:spring-boot-starter-web:3.4.4")
    implementation("org.springframework.boot:spring-boot-starter-validation:3.4.4")
    implementation("org.springframework.boot:spring-boot-devtools:3.4.4")
    testImplementation "org.springframework.boot:spring-boot-starter-test:3.4.4"

    // Lombok
    implementation 'org.projectlombok:lombok:1.18.38'
}

3. 验证依赖一致性

运行以下命令检查依赖树,确保没有javax.*开头的JSF相关依赖:

./gradlew dependencies

4. 清理缓存并重新构建

执行以下命令清理旧缓存,避免残留的冲突依赖:

./gradlew clean build --refresh-dependencies

完成以上步骤后重新启动项目,即可解决ClassNotFoundException问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:54:54