Java11升级Java17注册DocumentProvider报RESTEASY003325错误
问题说明
将Maven项目从Java 11升级到Java 17时,使用4.7.4.Final版本的RestEasy,注册org.jboss.resteasy.plugins.providers.DocumentProvider时抛出构造失败的异常,已执行依赖强制更新、IDEA缓存清理操作仍然报错。
当前使用的RestEasy版本配置:
<resteasy.version>4.7.4.Final</resteasy.version>
触发报错的代码片段:
public static ResteasyProviderFactory RESTEASY_PROVIDER_FACTORY = new ResteasyProviderFactoryImpl() {{ registerProvider(org.jboss.resteasy.plugins.providers.DataSourceProvider.class); registerProvider(org.jboss.resteasy.plugins.providers.DocumentProvider.class); // 报错行
核心报错信息:
Caused by: java.lang.RuntimeException: RESTEASY003325: Failed to construct public org.jboss.resteasy.plugins.providers.DocumentProvider(org.jboss.resteasy.spi.ResteasyConfiguration) at org.jboss.resteasy.core.ConstructorInjectorImpl.constructOutsideRequest(ConstructorInjectorImpl.java:250) at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:209) at org.jboss.resteasy.core.providerfactory.Utils.createProviderInstance(Utils.java:102) at org.jboss.resteasy.core.providerfactory.CommonProviders.processProviderContracts(CommonProviders.java:87) ... 37 more
根因分析
该问题和IntelliJ IDEA配置同步、依赖缓存无关,核心原因是RestEasy 4.7.4.Final版本本身不兼容Java 17运行环境:
- RestEasy 4.x系列的适配范围是Java 8到Java 11,没有针对Java 17做兼容处理。Java 17默认开启的JDK内部API强封装、旧版Jakarta EE类裁剪的改动,会直接导致4.x版本内置的
DocumentProvider初始化时找不到依赖的内部类、没有足够的反射访问权限,最终抛出构造失败的异常。 - 执行
mvn clean compile -U、重新导入依赖这类操作只能解决依赖缺失、缓存不一致的问题,无法修复版本本身的兼容性缺陷。
解决方案
推荐方案(长期可用)
直接升级RestEasy版本到6.2.x及以上的稳定版,RestEasy 6.x系列官方适配Java 17,同时对接Jakarta EE 9+规范,从底层修复了Java 17下所有内置Provider的初始化问题。
修改pom.xml中的版本配置即可:
<resteasy.version>6.2.7.Final</resteasy.version>
注意事项:
- 升级到6.x版本后,JAX-RS、Servlet相关注解的包名会从
javax.*切换为jakarta.*,如果项目中存在直接引用旧包名的代码,需要同步替换包路径,否则会出现类找不到的报错。 - 修改完版本后,在IDEA的Maven面板点击重新导入按钮,再执行clean、compile操作即可正常启动。
临时兼容方案(不推荐长期使用)
如果因为项目依赖约束暂时无法升级RestEasy大版本,可以在项目启动参数中添加JVM模块开放参数,临时绕过Java 17的强封装限制:
--add-opens java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED --add-opens java.xml/com.sun.org.apache.xml.internal.serialize=ALL-UNNAMED
该方案仅做临时兼容,后续还是建议升级RestEasy版本适配Java 17,避免出现其他隐藏的兼容性问题。
内容的提问来源于stack exchange,提问作者Baradé
相关产品推荐
相关产品推荐

