2012-04-17 30 views
13

Tôi có một bean @SessionScoped @Named với một phương pháp @Producer cho một đối tượng người dùng:CDI phụ thuộc nhập nhằng

@Named @SessionScoped 
public class UserBean implements Serializable 
{ 
    //... 
    @Named @Produces @LoggedIn @SessionScoped 
    public MyUser getCurrentUser() {return user;} 
} 

này hoạt động tốt trong thiết lập của tôi (JBoss-7.1.1-Final) và nó không có vấn đề để truy cập người dùng các trường từ các trang JSF với #{currentUser.name}. Vòng loại là org.jboss.seam.security.annotations.LoggedIn. Bây giờ tôi muốn @Inject thành viên này trong một lĩnh vực trong một @Named Bean:

@Named 
public class FavBean implements Serializable 
{ 
    private @Inject @LoggedIn MyUser currentUser; 
} 

này mang lại cho tôi những lỗi:

org.jboss.weld.exceptions.DeploymentException: 
WELD-001409 Ambiguous dependencies for type [MyUser] with qualifiers [@Default] at 
    injection point [[field] @Inject @LoggedIn test.FavBean.currentUser]. 
Possible dependencies [[Managed Bean [class test.ejb.MyUser] with qualifiers 
    [@Any @Default], 
Producer Method [MyUser] with qualifiers [@Any @Default] declared as [[method] 
    @Named @Produces @LoggedIn @SessionScoped public test.UserBean.getCurrentUser()]]] 

Tôi không hiểu sự phụ thuộc đầu tiên Managed Bean [class test.ejb.MyUser] Lớp này là một đơn giản @Entity và được triển khai trong một ebb.jar trong một EAR. Để giải quyết sự cố, tôi hiện đang tiêm UserBean nhận người dùng từ đó.

Trả lời

22

Điều này là do CDI tìm kiếm đậu theo loại và thực thể của bạn và phương thức sản xuất trả về cùng một loại. Đó là lý do tại sao nó là mơ hồ.

Bạn cần xác định bộ định tính mới và chú thích nó bằng phương pháp sản xuất của bạn.

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

Thêm chú thích này để phương pháp sản xuất của bạn:

@Named @Produces @CurrentUser @LoggedIn @SessionScoped 
public MyUser getCurrentUser() {return user;} 
+1

Hoặc sửa đổi chú thích 'LoggedIn' bằng cách thêm 'Trình phân loại' vào nó. Có vẻ như nó không có 'Qualifier'. –

3

Tôi có vấn đề rất giống nhau, và tôi đã nhận một số giúp đỡ ngoại tuyến. Vấn đề của tôi là dịch vụ của tôi, nó được đưa vào tai được triển khai VÀ trong dự án web của tôi. Đó là một sự trùng lặp ngẫu nhiên, bỏ một bản sao, và nó cũng sẽ hoạt động nếu nó là trường hợp của bạn.

ở đây trên hình ảnh sau đây tôi đã có esb_khr bên trong esb_khr_web, tôi đã xóa. Trong nhật thực: đi đến các thuộc tính và lắp ráp triển khai.

enter image description here

2

Tôi không phải là một chuyên gia nhưng tôi có một vấn đề tương tự, và tôi cố định nó theo cách đơn giản hơn, bằng cách chú thích các hạt riêng của mình với @Alternative, do đó sản xuất được ưa chuộng. Có thể tôi đang thiếu một số tác dụng phụ nhưng điều này làm việc xa như tôi có thể nhìn thấy/cần thiết.

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