Ответ 1
Вы можете найти BeanManager
через JNDI (java:comp/BeanManager
), а затем использовать API JSR-299, отвиснув от BeanManager
, чтобы получить контекстную ссылку на управляемый bean.
JSR-299 beans недоступен для прямого поиска JNDI.
Можно ли (и если да, как?) искать управляемый CDI beans с помощью javax.naming.Context#lookup
в модуле EJB?
Я использую GlassFish v3. Я полагаю, что я могу использовать @Named
, но что такое JNDI-имя управляемого CDI bean? Я хочу найти их из неуправляемых POJO, поэтому я не могу использовать @Inject
.
Вы можете найти BeanManager
через JNDI (java:comp/BeanManager
), а затем использовать API JSR-299, отвиснув от BeanManager
, чтобы получить контекстную ссылку на управляемый bean.
JSR-299 beans недоступен для прямого поиска JNDI.
Вы также можете получить доступ к BeanManager с помощью CDI.current(), что избавит вас от ввода нескольких строк кода. Пример из здесь
Использование CDI.current()
BeanManager bm = CDI.current().getBeanManager();
Использование JNDI:
BeanManager bm = null;
try {
InitialContext context = new InitialContext();
bm = (BeanManager) context.lookup("java:comp/BeanManager");
} catch (Exception e) {
e.printStackTrace();
}
Теперь у вас есть BeanManager, вы можете получить доступ к вашему CDI beans, выполнив поиск по типу или поиск по имени.
Тип:
Bean<CrudService> bean = (Bean<CrudService>) bm.getBeans(CrudService.class).iterator().next();
CreationalContext<CrudService> ctx = bm.createCreationalContext(bean);
CrudService crudService = (CrudService) bm.getReference(bean, CrudService.class, ctx);
Имя на основе
Bean bean = bm.getBeans("crudService").iterator().next();
CreationalContext ctx = bm.createCreationalContext(bean);
CrudService crudService = bm.getReference(bean, bean.getClass(), ctx);
Полный пример:
//get reference to BeanManager
BeanManager bm = CDI.current().getBeanManager();
Bean<CrudService> bean = (Bean<CrudService>) bm.getBeans(CrudService.class).iterator().next();
CreationalContext<CrudService> ctx = bm.createCreationalContext(bean);
//get reference to your CDI managed bean
CrudService crudService = (CrudService) bm.getReference(bean, CrudService.class, ctx);
UPDATE - теперь это можно сделать в одной строке, если вы используете CDI 1.1:
CrudService crudService = CDI.current().select(CrudService.class).get();