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
相关产品推荐
相关产品推荐

