2011-08-07 24 views
7

Tôi muốn đưa người dùng hiện tại sử dụng @Inject @Current User trên tất cả các lớp (ví dụ: lớp web, lớp EJB). Để làm được điều này, tôi có theo phương pháp CDI Nhà sản xuất:Gọi phương thức sản xuất theo phạm vi phiên CDI từ bean phiên không trạng thái EJB

@Named 
@SessionScoped 
public class UserController { 
    @Resource SessionContext sessionContext; 
    @EJB UserDao userDao; 

    @Produces @Current 
    public User getCurrentUser() { 
    String username = sessionContext.getCallerPrincipal().getName(); 
    User user = userDao.findByUsername(username); 
    } 
} 

@Qualifier 
@Target({TYPE, METHOD, PARAMETER, FIELD}) 
@Retention(RUNTIME) 
public @interface Current{} 

Bây giờ, tôi muốn tiêm cho người sử dụng hiện tại vào một EJB stateless session bean như sau:

@Stateless 
public class SomeBackendService { 
    @Inject @Current 
    private User user; 
} 

Câu hỏi của tôi: Liệu đối tượng người dùng hiện tại luôn được tiêm lại sau khi phiên thay đổi, bởi vì các phụ thuộc của bean phiên không trạng thái thường được tiêm một lần vào thời gian tạo và bean có thể được gộp lại và được sử dụng trong các phiên khác nhau?

Trả lời

4

Mặc dù tôi chưa thử tình huống chính xác này, trong hạt CDI thường không được tiêm lại. Thay vào đó, một proxy được tiêm nhận biết ngữ cảnh của nó.

Thông qua cơ chế này, có thể chèn một phiên bản đậu phạm vi trong một phạm vi ứng dụng đậu. Mỗi người dùng của ứng dụng scoped bean đi đến cùng một bean và cùng một proxy, nhưng proxy sau đó sẽ tự động giải quyết các cuộc gọi trên nó đến một bean khác nhau cho mỗi người dùng.

Vì vậy, mặc dù phạm vi @Stateless về cơ bản là 'ứng dụng', có thể proxy đại diện cho User trong `SomeBackendService 'của bạn vẫn được ủy quyền cho phiên bản phiên bản chính xác.

p.s.

Nếu với lớp bạn thực sự có nghĩa là mô-đun như trong web và EJB module là một phần của một EAR, nó sẽ trở thành phức tạp hơn một chút, như CDI không luôn luôn làm việc như mong đợi giữa các module (đặc biệt là ở JBoss AS). Điều này một phần là do sự mơ hồ về 'ứng dụng' là gì và do đó phạm vi ứng dụng nằm trong một EAR.

+0

Hoàn toàn quên proxy. Tôi đã thử nó và nó hoạt động như mong đợi. Cảm ơn. – Theo

1

Theo thiết kế, bean phiên không trạng thái của bạn không được có trạng thái "Người dùng", không có trạng thái bất hợp pháp.

Nếu bạn muốn EJB của mình có trạng thái, hãy sử dụng @Stateful để thay thế.

1

Có, với mỗi phương thức kinh doanh được gọi là vùng chứa sẽ được tiêm lại tất cả các phụ thuộc của SLSB của bạn. Đây là văn bản đảm bảo điều này trong đặc tả EJB 3.1:

"Nếu bean phiên sử dụng tiêm phụ thuộc, thùng chứa sẽ đưa các tham chiếu này sau khi cá thể bean được tạo và trước khi bất kỳ phương thức nghiệp vụ nào được gọi trên cá thể bean. " - Mục 4.3.2

tôi đã nghi ngờ này quá và tôi đã post một câu hỏi giải thích tình trạng này here

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