Czy Mogę (i jak) wyszukać CDI managed beans używając javax.nazewnictwo.Context#lookup w module EJB?

Czy Mogę (a jeśli tak, to w jaki sposób?) lookup CDI managed Beans using javax.naming.Context#lookup in EJB module?

Używam GlassFish v3. Przypuszczam, że mogę użyć @Named, ale jaka jest nazwa JNDI CDI managed bean? Chcę je wyszukać z niezarządzanych Pojo, więc nie mogę użyć @Inject.
Author: Piotr Nowicki, 2011-11-17

2 answers

Możesz wyszukać BeanManager za pomocą JNDI (java:comp/BeanManager), a następnie użyć interfejsu API JSR-299 zawieszonego z BeanManager, aby uzyskać kontekstowe odniesienie do zarządzanej fasoli.

Zarządzane fasole JSR-299 nie są dostępne dla bezpośredniego wyszukiwania JNDI.

 5
Author: covener,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-07 09:18:23

Możesz również uzyskać dostęp do Menedżera Beanmanagera za pomocą CDI.current (), która oszczędza wpisanie kilku linijek kodu. Przykład wzięty z tutaj

Za pomocą CDI.current ()

BeanManager bm = CDI.current().getBeanManager();

Użycie JNDI:

BeanManager bm = null;
try {
    InitialContext context = new InitialContext();
    bm = (BeanManager) context.lookup("java:comp/BeanManager");
} catch (Exception e) {
    e.printStackTrace();
}

Teraz masz BeanManager możesz uzyskać dostęp do fasoli CDI, wykonując wyszukiwanie oparte na typie lub na nazwie.

Oparte na typie:

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

Nazwa-based

Bean bean = bm.getBeans("crudService").iterator().next();
CreationalContext ctx = bm.createCreationalContext(bean);
CrudService crudService = bm.getReference(bean, bean.getClass(), ctx);

Pełny przykład:

//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 - można to teraz osiągnąć w jednej linii, jeśli używasz CDI 1.1:

CrudService crudService = CDI.current().select(CrudService.class).get();
 21
Author: Chris Ritchie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 00:59:49