2011-11-17 11 views

Odpowiedz

6

Możesz wyszukać BeanManager przez JNDI (java:comp/BeanManager), a następnie użyć interfejsu API JSR-299 zawieszonego na BeanManager, aby uzyskać odniesienie kontekstowe do zarządzanego komponentu bean.

Ziarna zarządzane JSR-299 nie są dostępne do bezpośredniego wyszukiwania JNDI.

+3

Znalazłem dobry przykład kodu na http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/ – Sebi

+0

Nazwany @ManagedBean (value = "MyManagedBean") POJO można sprawdzić za pomocą JNDI za pomocą np. InitialContext.doLookup ("java: app/myapp/MyManagedBean"); zobacz dokumentacja API javax.annotation.ManagedBean –

+0

Ciekawi mnie, czym dokładnie jest 'javax.annotation.ManagedBean', tutaj jest dobra odpowiedź: http://stackoverflow.com/a/32420123/1341535 –

16

Dostęp do BeanManager można również uzyskać za pomocą CDI.current(), co pozwala zapisać kilka prostych wierszy kodu. Przykład wzięty z here

Korzystanie CDI.current()

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

Korzystanie 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żna uzyskać dostęp do CDI fasolę, wykonując jedną odnośnika typu oparte lub wyszukiwanie oparte na nazwach.

Rodzaj oparta:

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 oparte

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 - To może teraz zostać osiągnięte w jednej linii, jeśli używasz CDI 1.1 :

CrudService crudService = CDI.current().select(CrudService.class).get(); 
+5

W moim przypadku musiałem użyć 'bean.getBeanClass()' zamiast 'bean.getClass()', aby uniknąć wyjątku WELD-001305. –

+3

Możesz zrobić CDI.current(). Select (CrudService.class) .get() z CDI 1.1+ – ravthiru

+0

Jak przekazać dane uwierzytelniające podczas korzystania z CDI.current()? Podczas korzystania z InitialContext() mogę określić Zleceniodawcę we właściwościach konstruktora. Jak zrobić coś podobnego z CDI.current()? –

Powiązane problemy