Jersey2中PerRequestTypeInjectableProvider的等效替代方案是什么?
Jersey 2 替换 PerRequestTypeInjectableProvider 后 Session 注入为 null 的解决方法
问题根源
你的新代码存在两个关键错误:
- 作用域不匹配:
AbstractBinder是应用启动时初始化的单例组件,直接在其中用@Context注入HttpServletRequest无效——HttpServletRequest是请求作用域对象,无法在单例类中直接获取,导致request始终为null。 - 接口使用错误:
InjectionResolver是用来处理自定义注入注解的接口,并非用于提供特定类型的实例,你用它来生成Session实例属于用法错误。
正确实现方案
在 Jersey 2 中,替换 PerRequestTypeInjectableProvider 的标准方式是使用 HK2 Factory,它支持请求作用域的依赖注入,能正确获取当前请求的 HttpServletRequest。
步骤1:创建 Session 实例工厂
实现 Factory<Session> 接口,在工厂中注入请求作用域的 HttpServletRequest,并生成 Session 实例:
import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.Context; import org.glassfish.hk2.api.Factory; public class SessionFactory implements Factory<Session> { private final HttpServletRequest request; @Inject public SessionFactory(@Context HttpServletRequest request) { this.request = request; } @Override public Session provide() { // 生成Session并设置到request属性中 Session session = SessionUtils.createSession(request); request.setAttribute(WebSessionConfig.s.servlet_attribute_name, session); return session; } @Override public void dispose(Session session) { // 可选:如果需要清理Session资源,在这里实现 } }
步骤2:通过 AbstractBinder 绑定类型
创建 AbstractBinder 子类,将 Session 类型绑定到上述工厂,并指定请求作用域:
import org.glassfish.hk2.utilities.binding.AbstractBinder; import javax.ws.rs.core.RequestScoped; public class UserSessionBinder extends AbstractBinder { @Override protected void configure() { bindFactory(SessionFactory.class) .to(Session.class) .in(RequestScoped.class); // 指定请求作用域,确保每次请求生成新实例 } }
步骤3:注册 Binder 到 Jersey 应用
在你的 ResourceConfig 或 Application 子类中注册这个 Binder:
import javax.ws.rs.ApplicationPath; import org.glassfish.jersey.server.ResourceConfig; @ApplicationPath("/api") public class MyApplication extends ResourceConfig { public MyApplication() { register(new UserSessionBinder()); // 注册其他资源、过滤器等 } }
说明
Factory是 HK2(Jersey 2 的依赖注入容器)提供的标准实例提供者,支持请求作用域,能在每次请求到来时实例化并获取当前请求的HttpServletRequest。- 指定
RequestScoped作用域后,每次 HTTP 请求都会调用provide()方法生成新的Session,和 Jersey 1 中PerRequestTypeInjectableProvider的行为完全一致。
内容的提问来源于stack exchange,提问作者user7080065
相关产品推荐
相关产品推荐

