You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jersey2中PerRequestTypeInjectableProvider的等效替代方案是什么?

Jersey 2 替换 PerRequestTypeInjectableProvider 后 Session 注入为 null 的解决方法

问题根源

你的新代码存在两个关键错误:

  1. 作用域不匹配:AbstractBinder 是应用启动时初始化的单例组件,直接在其中用 @Context 注入 HttpServletRequest 无效——HttpServletRequest 是请求作用域对象,无法在单例类中直接获取,导致 request 始终为 null。
  2. 接口使用错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:10:24