我試圖做一些類似的事情,在JBoss 7.1上與CDI bean共享上下文。儘管它不適用於我,但我不確定是否是JBoss7.1的當前狀態導致了這些問題,因此它可能適用於您?
我所做的是對啓動的東西,有訪問ServletContext
(在我的情況下,JAX-RS Application
,但可能對你的監聽器或Servlet)在其訪問應用程序作用域的bean,並設置ServletContext
。
爲了彌補對CDI的世界裏,我用從以下URI的配方來創建bean實例: http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/extend.html#d0e4978
相關的代碼是一樣的東西:
@SuppressWarnings("unchecked")
public <T> T getBean(Class<T> instanceClass) throws NamingException
{
BeanManager beanManager
= (BeanManager) InitialContext.doLookup("java:comp/BeanManager");
AnnotatedType<Object> annotatedType
= (AnnotatedType<Object>) beanManager.createAnnotatedType(instanceClass);
InjectionTarget<Object> injectionTarget
= beanManager.createInjectionTarget(annotatedType);
CreationalContext<Object> context
= beanManager.createCreationalContext(null);
Object instance = injectionTarget.produce(context);
injectionTarget.inject(instance, context);
injectionTarget.postConstruct(instance);
return (T) instance;
}
然後你可以設置成一個bean,看起來像:
package some.package;
import javax.enterprise.context.ApplicationScoped;
import javax.servlet.ServletContext;
/** An application context, initialised on application startup. */
@ApplicationScoped
public class AppContext
{
private ServletContext servletContext;
/** Return the servlet context for the current application. */
public ServletContext getServletContext()
{
return servletContext;
}
public void setServletContext(ServletContext servletContext)
{
this.servletContext = servletContext;
}
}
使用網頁摘要:
getBean(AppContext.class).setServletContext(servletContext);
在您的啓動代碼。然後,你應該只需要@Inject
上下文在任何你想要的CDI構造中...... 假設它在你的servlet init之後運行或者其他什麼。
例如:
@Inject
private AppContext appContext;
我會好奇,如果這部作品在其他情況下...
一個延伸是CDI實現的啓動過程中執行。所以不幸的是,由於自舉過程還沒有完成,這種注入在這種早期狀態下將不起作用。 – chkal
不,對不起!在CDI啓動程序的這個早期階段,事件將不起作用。 – chkal
我的理解是否正確:你想在創建ServletContext之前訪問'ServletContext'參數?沒有辦法等待事件發生? – Femi