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

WildFly10升级24/26部署RESTEasy应用报providerFactory空指针异常

问题场景
  • 基于wildfly-server-migration工具完成WildFly 10到24版本的迁移后,在WildFly 24上部署存量RESTEasy应用触发报错;后续升级到WildFly 26版本部署,报完全相同的错误。
  • 曾尝试替换路径\modules\system\layers\base\org\jboss\resteasy\resteasy-spring\main\bundled\resteasy-spring-jar下的Spring jar包,将版本从3.1.5升级到4.7.6,未解决问题。
部署报错堆栈
java.lang.RuntimeException: java.lang.NullPointerException: Cannot invoke "org.jboss.resteasy.spi.ResteasyProviderFactory.registerProviderInstance(Object)" because "this.providerFactory" is null
        at org.wildfly.extension.undertow@24.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:90)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
        at java.base/java.lang.Thread.run(Thread.java:833)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: java.lang.RuntimeException: java.lang.NullPointerException: Cannot invoke "org.jboss.resteasy.spi.ResteasyProviderFactory.registerProviderInstance(Object)" because "this.providerFactory" is null
        at io.undertow.servlet@2.2.8.Final//io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:257)
        at org.wildfly.extension.undertow@24.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:105)
        at org.wildfly.extension.undertow@24.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:87)
        ... 8 more
Caused by: java.lang.NullPointerException: Cannot invoke "org.jboss.resteasy.spi.ResteasyProviderFactory.registerProviderInstance(Object)" because "this.providerFactory" is null
        at deployment.abcd-SNAPSHOT.war//org.jboss.resteasy.plugins.guice.ModuleProcessor.processInjector(ModuleProcessor.java:48)
        at deployment.abcd-SNAPSHOT.war//com.nexala.spectrum.rest.service.SpectrumContextListener.contextInitialized(SpectrumContextListener.java:84)
        at io.undertow.servlet@2.2.8.Final//io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187)
        at io.undertow.servlet@2.2.8.Final//io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:219)
        at io.undertow.servlet@2.2.8.Final//io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:187)
        at io.undertow.servlet@2.2.8.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
        at io.undertow.servlet@2.2.8.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
        at org.wildfly.extension.undertow@24.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
        at org.wildfly.extension.undertow@24.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1535)
        at org.wildfly.extension.undertow@24.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1535)
        at org.wildfly.extension.undertow@24.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1535)
        at org.wildfly.extension.undertow@24.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1535)
        at io.undertow.servlet@2.2.8.Final//io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:255)
        ... 10 more
问题根因
  • 空指针触发逻辑明确:应用自定义的SpectrumContextListener在上下文初始化阶段,直接调用RESTEasy Guice模块的ModuleProcessor.processInjector方法时,ResteasyProviderFactory实例尚未完成初始化。
  • WildFly 10之后的高版本(含24、26)调整了RESTEasy核心组件的初始化顺序:WildFly 10版本中ResteasyProviderFactory会在自定义ServletContextListener执行前完成初始化,高版本中该实例的初始化时机晚于普通自定义ServletContextListener的执行时机,直接调用注册逻辑就会触发空指针。
  • 之前替换resteasy-spring目录下Spring jar包的操作属于无效排错:本次报错和Spring依赖无关联,堆栈明确显示触发点来自RESTEasy Guice集成模块,修改Spring jar版本无法解决初始化顺序问题,反而可能引入额外的模块依赖冲突。
修复步骤
  • 先回滚之前对WildFly系统模块的修改:把\modules\system\layers\base\org\jboss\resteasy\resteasy-spring\main\bundled\resteasy-spring-jar路径下手动升级的Spring jar包恢复为对应WildFly版本自带的原始版本,避免后续出现类加载、模块依赖不兼容的额外问题。
  • 调整应用内Guice集成逻辑,不要直接在自定义ServletContextListener.contextInitialized方法中硬编码调用ModuleProcessor.processInjector做Provider注册,改用RESTEasy标准扩展机制完成Guice模块注册:
    • 让自定义的SpectrumContextListener继承org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener,不再直接实现原生ServletContextListener接口。
    • 重写父类的getModules方法,返回应用自定义的Guice Module列表,由RESTEasy框架在ResteasyProviderFactory初始化完成后,自动执行注入和Provider注册逻辑,从根本上规避初始化顺序冲突。
  • 对齐RESTEasy依赖版本:将应用war包内打包的resteasy-guice等RESTEasy相关组件版本,调整为和当前部署WildFly版本内置的RESTEasy版本完全一致,不要在应用内单独打包版本不匹配的RESTEasy组件,避免类加载冲突导致的实例获取异常。

内容的提问来源于stack exchange,提问作者Linidu Praneeth Gunathilaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:12:16