java - 在 CDI SessionScoped bean 中注入(inject) HttpServletRequest

标签 java jakarta-ee cdi

我有一个 session 范围的 CDI bean,我需要以某种方式访问​​此 bean 的 @PostConstruct 方法中的 HttpServletRequest 对象。是否可以?我试图注入(inject)这样的对象,但结果是:

WELD-001408 Unsatisfied dependencies for type [HttpServletRequest] with qualifiers     [@Default] at injection point [[field] @Inject ...]

我在谷歌搜索时了解到,Seam 框架具有这样的功能,但我在 GlassFish 服务器上有一个标准的 Java EE 应用程序。

是否有可能以某种方式将请求传递给 CDI bean 的 @PostConstruct 方法?

最佳答案

根据您的评论,您想要访问用户主体。您可以像这样注入(inject)它:@Inject Principal principal;@Resource Principal principal;,参见 Java EE 6 Tutorial .

更新

我会直接回答你的问题。在 Java EE 7 (CDI 1.1) 中,开箱即用地支持 HttpServletRequest 注入(inject)。然而,在 Java EE 6 (CDI 1.0) 中,这不是开箱即用的支持。要使其正常工作,请将以下类包含到您的网络应用程序中:

import javax.enterprise.inject.Produces;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class CDIServletRequestProducingListener implements ServletRequestListener {

    private static ThreadLocal<ServletRequest> SERVLET_REQUESTS = new ThreadLocal<>();

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        SERVLET_REQUESTS.set(sre.getServletRequest());
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        SERVLET_REQUESTS.remove();
    }

    @Produces
    private ServletRequest obtain() {
        return SERVLET_REQUESTS.get();
    }

}

注意:仅在 GlassFish 3.1.2.2 上测试

关于java - 在 CDI SessionScoped bean 中注入(inject) HttpServletRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18189337/

相关文章:

java - 我可以使用带有 CDI 的 EJB 无状态 Bean 来维护用户 session 吗?

Java & Akka : Creating an actor B from actor A

java - 动态添加bean和jar到Java应用程序

java - 注入(inject)有问题

java - 服务器端的响应式 Web 模式

java - 在混合租赁上下文中生成 EntityManager

postgresql - 生产服务器上类型时间戳的错误值

java - 通过 main 运行的同一类的两个实例 - 它们与 main 的每个线程相关联的唯一标识符是什么?

java - 在一个驱动程序中运行依赖的 hadoop 作业

Java 在 Python 中修改 UTF-8 字符串