2011-11-17 12 views

risposta

6

È possibile cercare BeanManager tramite JNDI (java:comp/BeanManager) quindi utilizzare l'API JSR-299 appesa su BeanManager per ottenere un riferimento contestuale a un bean gestito.

I bean gestiti JSR-299 non sono disponibili per la ricerca JNDI diretta.

+3

Ho trovato un buon esempio di codice in http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/ – Sebi

+0

Un POJO denominato @ManagedBean (value = "MyManagedBean") può essere cercato tramite JNDI con ie InitialContext.doLookup ("java: app/myapp/MyManagedBean"); vedi API doc di javax.annotation.ManagedBean –

+0

Ero curioso di sapere cosa 'javax.annotation.ManagedBean' è esattamente, ecco una buona risposta: http://stackoverflow.com/a/32420123/1341535 –

16

È anche possibile accedere a BeanManager utilizzando CDI.current(), che consente di risparmiare alcune righe di codice. Esempio tratto da here

Utilizzando CDI.current()

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

Utilizzando JNDI:

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

Ora si ha la BeanManager è possibile accedere ai fagioli CDI effettuando una una ricerca di tipo a base di o una ricerca basata sul nome.

tipo basata:

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

Nome basata

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

esempio completa:

//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 - Questo può essere raggiunto in una sola riga, se si utilizza CDI 1.1 :

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

Nel mio caso ho dovuto usare 'bean.getBeanClass()' invece di 'bean.getClass()' per evitare l'eccezione WELD-001305. –

+3

È possibile eseguire CDI.current(). Selezionare (CrudService.class) .get() con CDI 1.1+ – ravthiru

+0

Come si passano le credenziali di autenticazione quando si utilizza CDI.current()? Quando si utilizza InitialContext(), posso specificare il principal nelle proprietà del costruttore. Come posso fare qualcosa di equivalente con CDI.current()? –

Problemi correlati