Jersey 1.x迁移至2.x后ContextResolver注入为空问题
Jersey 2.x + JDK17 中 ContextResolver 注入为 null 的解决方案
问题背景
项目从JDK8+Jersey1.19.2升级至JDK17+Jersey2.43后,原通过@Context注入ContextResolver<MyProducer>的逻辑获取到null值,此前在JDK8环境下功能正常。
核心问题代码片段:
@Context public void setMyProvider(ContextResolver<MyProducer> myProvider){ if(myProvider != null) // 此处获取到null值 this.myProducer = myProvider.getContext(MyProducer.class); }
问题根源
Jersey 2.x 对@Context注入的处理逻辑与1.x存在本质差异:直接注入ContextResolver<T>的方式不再被框架支持,必须通过Providers接口间接获取对应的上下文解析器。
解决方案
1. 修改资源类的注入逻辑
将直接注入ContextResolver<T>改为注入Providers接口,通过该接口的getContextResolver方法获取目标解析器:
@Path("/hello-world") public class HelloResource { private MyProducer myProducer; @Context public void setProviders(Providers providers){ // 获取对应类型的ContextResolver ContextResolver<MyProducer> resolver = providers.getContextResolver(MyProducer.class, MediaType.WILDCARD_TYPE); if(resolver != null) { this.myProducer = resolver.getContext(MyProducer.class); } } @GET @Produces("text/plain") public String hello() { System.out.println(myProducer); return "Hello, World!"; } }
2. 确认Provider的注册有效性
确保TestProducer类被正确注册到Jersey容器:
- 若使用包扫描,检查
jersey.config.server.provider.packages参数是否包含TestProducer所在包路径 - 若使用
ResourceConfig显式注册,确保register(TestProucer.class)语句已正确添加:
public class ResourceApp extends ResourceConfig { public ResourceApp() { packages("com.example.jerseydemo2"); register(TestProucer.class); register(JacksonFeature.class); register(HelloResource.class); } }
3. 验证依赖完整性
确认Jersey 2.x的核心依赖已完整引入,特别是负责注入的jersey-hk2:
<dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> <version>2.43</version> </dependency>
验证步骤
- 启动Tomcat服务器,访问接口
/api/hello-world - 检查控制台输出:
- 若
Test Producer working日志正常打印,说明TestProducer已被容器加载 - 若
MyProducer实例信息正常输出,说明注入逻辑生效
- 若
内容的提问来源于stack exchange,提问作者CodeRager99
相关产品推荐
相关产品推荐

