在CDI SessionScoped bean中注入HttpServletRequest

woj*_*k88 5 java java-ee cdi

我有一个会话范围的CDI bean,我需要以某种方式访问HttpServletRequest这个bean的@PostConstruct方法中的对象.可能吗?我试图注入这样一个对象,但结果是:

WELD-001408 Unsatisfied dependencies for type [HttpServletRequest] with qualifiers     [@Default] at injection point [[field] @Inject ...]
Run Code Online (Sandbox Code Playgroud)

正如我在google搜索中所理解的那样,Seam框架具有这样的功能,但我在GlassFish服务器上有一个标准的Java EE应用程序.

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

rdc*_*rng 12

根据您的评论,您希望访问用户主体.你可以像这样注入它:@Inject Principal principal;或者@Resource Principal principal;,参见Java EE 6 Tutorial.

更新

我会回答你的直接问题.在Java EE 7(CDI 1.1)中,支持开箱即用的HttpServletRequest注入.但是,在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();
    }

}
Run Code Online (Sandbox Code Playgroud)

注意:仅在GlassFish 3.1.2.2上测试