Могу ли я (и как) искать компоненты, управляемые CDI, используя javax.naming.Context # lookup в модуле EJB? - PullRequest
15 голосов
/ 17 ноября 2011

Могу ли я (и если да, как?) Искать компоненты, управляемые CDI, используя javax.naming.Context#lookup в модуле EJB?

Я использую GlassFish v3.Я полагаю, что могу использовать @Named, но как называется JNDI управляемого компонента CDI?Я хочу найти их в неуправляемых POJO, поэтому я не могу использовать @Inject.

Ответы [ 2 ]

27 голосов
/ 10 марта 2015

Вы также можете получить доступ к 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, выполнив поиск по типу или по имени.

Тип на основе:

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);

ОБНОВЛЕНИЕ - Теперь это может быть достигнуто в одну строку, если вы используете CDI 1.1:

CrudService crudService = CDI.current().select(CrudService.class).get();
6 голосов
/ 19 ноября 2011

Вы можете искать BeanManager через JNDI (java:comp/BeanManager), а затем использовать JSR-299 API, подвешенный к BeanManager, чтобы получить контекстную ссылку на управляемый бин.

Управляемые bean-компоненты JSR-299 недоступны для прямого поиска JNDI.

...