2011-11-17 16 views
12

Tôi có thể (và nếu có, làm thế nào?) Tra cứu các hạt được quản lý bằng CDI bằng cách sử dụng javax.naming.Context#lookup trong mô-đun EJB?Tôi có thể (và cách) tra cứu các hạt được quản lý bằng CD javax.naming.Context # lookup trong mô-đun EJB không?

Tôi đang sử dụng GlassFish v3. Tôi cho rằng tôi có thể sử dụng @Named, nhưng tên JNDI của đậu được quản lý bằng CDI là gì? Tôi muốn tra cứu chúng từ các POJO không được quản lý nên tôi không thể sử dụng @Inject.

Trả lời

6

Bạn có thể tra cứu BeanManager qua JNDI (java:comp/BeanManager) sau đó sử dụng API JSR-299 được treo của số BeanManager để nhận tham chiếu theo ngữ cảnh cho bean được quản lý.

JSR-299 đậu được quản lý không có sẵn để tra cứu trực tiếp JNDI.

+3

Tôi tìm thấy một ví dụ mã tốt tại http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/ – Sebi

+0

Một tên @ManagedBean (value = "MyManagedBean") POJO có thể được tra cứu thông qua JNDI với nghĩa là InitialContext.doLookup ("java: app/myapp/MyManagedBean"); xem tài liệu API của javax.annotation.ManagedBean –

+0

Tôi đã tò mò về những gì 'javax.annotation.ManagedBean' chính xác là, đây là một câu trả lời tốt: http://stackoverflow.com/a/32420123/1341535 –

16

Bạn cũng có thể truy cập BeanManager bằng cách sử dụng CDI.current(), giúp bạn nhập một vài dòng mã tốt. Ví dụ lấy từ here

Sử dụng CDI.current()

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

Sử dụng JNDI:

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

Bây giờ bạn có BeanManager bạn có thể truy cập đậu CDI của bạn bằng cách thực hiện một trong hai một tra cứu loại dựa trên hoặc tra cứu dựa trên tên.

Loại dựa trên:

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

Tên dựa trên

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

Full dụ:

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

CẬP NHẬT - Điều này bây giờ có thể đạt được trong một dòng nếu bạn đang sử dụng CDI 1.1 :

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

Trong trường hợp của tôi, tôi phải sử dụng 'bean.getBeanClass()' thay vì 'bean.getClass()' để tránh ngoại lệ WELD-001305. –

+3

Bạn có thể làm CDI.current(). Select (CrudService.class) .get() với CDI 1.1+ – ravthiru

+0

Làm cách nào để vượt qua thông tin xác thực khi sử dụng CDI.current()? Khi sử dụng InitialContext() tôi có thể chỉ định Hiệu trưởng trong các thuộc tính của hàm tạo. Làm thế nào để làm một cái gì đó tương đương với CDI.current()? –

Các vấn đề liên quan