Jersey Client 3.1.1报错InjectionManagerFactory not found求解决方案
Jersey Client 3.1.1 「InjectionManagerFactory not found」问题解决
问题背景
使用Jersey Client 3.1.1向REST API提交JSON时,调用JerseyWebTarget.request()方法触发java.lang.IllegalStateException: InjectionManagerFactory not found异常,具体抛出点为ClientConfig$State.initRuntime()中执行Injections.createInjectionManager()时。运行环境为Servlet 5.0/Tomcat 10,必须使用Jersey 3.x版本,已尝试添加jersey-hk2:3.1.1及jersey-cdi1x依赖,均未解决问题。
原因分析
Jersey 3.x基于Jakarta EE 9+规范,依赖体系与2.x差异较大:
- 单纯引入
jersey-cdi1x仅适配CDI环境,独立使用Jersey Client时需要的是HK2注入实现 - 依赖传递可能导致版本不一致,或缺失核心注入管理器的实现类
- Tomcat 10的类加载机制可能影响依赖的加载优先级
解决方案
1. 明确引入完整的Client+HK2依赖(推荐)
直接指定jersey-client和jersey-hk2的3.1.1版本,避免依赖传递带来的版本偏差:
<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> <version>3.1.1</version> </dependency>
2. 手动指定注入管理器工厂
如果依赖正确但Factory仍无法被自动加载,在创建Client前手动设置系统属性指定HK2实现:
import org.glassfish.jersey.inject.hk2.Hk2InjectionManagerFactory; import org.glassfish.jersey.internal.inject.InjectionManagerFactory; // 初始化注入管理器工厂 System.setProperty(InjectionManagerFactory.class.getName(), Hk2InjectionManagerFactory.class.getName()); // 后续正常创建Client和WebTarget Client client = ClientBuilder.newClient(); WebTarget myWebTarget = client.target("你的API地址"); Builder builder = myWebTarget.request(MediaType.APPLICATION_JSON_TYPE);
3. 排查并解决依赖冲突
使用Maven命令查看依赖树,检查是否存在2.x版本的Jersey或HK2依赖:
mvn dependency:tree
若发现冲突依赖,在对应的<dependency>中添加<exclusions>排除低版本模块,确保所有Jersey相关依赖版本统一为3.1.1。
4. Tomcat 10环境适配
- 确保web.xml中未禁用Jersey的注入机制
- 若项目中同时引入其他CDI容器(如Weld),需明确配置Jersey优先使用HK2,可通过添加
jersey-hk2的优先级配置或在ClientConfig中注册HK2绑定。
内容的提问来源于stack exchange,提问作者Richard Sand
相关产品推荐
相关产品推荐

