【问题标题】:Getting JSF ServletContext in non-request environment in a CDI bean在 CDI bean 的非请求环境中获取 JSF ServletContext
【发布时间】:2015-04-09 09:44:35
【问题描述】:

我使用的是 TomEE+ 1.7.1。 使用 JSF 托管 bean,这段代码运行良好:

@ManagedBean( eager = true )
@ApplicationScoped
public class AppBean {

    @PostConstruct
    public void init() {
        ServletContext sc = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        if (GlobalSettings.TESTMODE) {
            sc.getSessionCookieConfig().setDomain("." + GlobalSettings.APP_DOMAIN_TEST);
        } else {
            sc.getSessionCookieConfig().setDomain("." + GlobalSettings.APP_DOMAIN);
        }
    }
}

init 函数在应用程序启动时运行,并且 ServletContext 可用。

我到处读到是时候迁移到 CDI bean 而不是 JSF bean。所以我想将@ManagedBean( eager = true ) 更改为@Named @Eager(@Eager 来自 Omnifaces)。 Init 函数在应用程序启动时运行,但没有 FacesContext,所以我无法获取 ServletContext。

一般问题:如何在 CDI bean 的非请求环境中获取 ServletContext? (ServletContext 不是一个 'per request' 对象,所以它应该在第一个请求之前存在。)

具体问题:如何在第一个请求发生之前从代码中动态设置会话 cookie 的域?

【问题讨论】:

    标签: jsf cookies initialization cdi


    【解决方案1】:

    您应该使用ServletContextListener 来对基于 servlet 的应用程序执行编程配置。

    @WebListener
    public class Config implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent event) {
            ServletContext servletContext = event.getServletContext(); 
            // ...
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent event) {
            ServletContext servletContext = event.getServletContext(); 
            // ...
        }
    
    }
    

    @WebListener 本质上也是 CDI 管理的,因此您可以在其中使用 @Inject 和朋友。

    应用程序范围的托管 bean 旨在保存应用程序范围的数据/状态,这些数据/状态可以在请求/视图/会话之间使用/共享。

    【讨论】:

      【解决方案2】:

      根据 CDI 规范,您可以将 @InjectServletContext 转换为 CDI bean。只需确保在@PostConstruct 中执行此操作,因为注入字段仅在构建后可用:

      @Inject ServletContext extCtxt;
      
      @PostConstruct
      public void doSomething(){
        // do something with your injected field
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 2015-04-20
        • 2011-02-28
        • 1970-01-01
        • 2016-05-15
        • 2015-04-15
        • 2013-10-03
        相关资源
        最近更新 更多