Я пытался сделать что-то похожее с общим контекстом с bean-компонентами CDI на JBoss 7.1. Хотя это не сработало для меня, я не уверен, что это текущее состояние JBoss7.1 вызвало проблемы, так что, возможно, оно будет работать для вас?
У меня при запуске было что-то, имеющее доступ к ServletContext
(в моем случае JAX-RS Application
, но, вероятно, для вас слушатель или сервлет), которое обращается к компоненту в области приложения и устанавливает ServletContext
в нем.
Чтобы соединиться с миром CDI, я использовал рецепт из следующего URI для создания экземпляра компонента:
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, в которой вы хотите ... при условии , что он запускается после инициализации вашего сервлета или как угодно.
Например:
@Inject
private AppContext appContext;
Мне будет любопытно, работает ли это в других ситуациях ...