2012-01-27 39 views
11

Đây là tình huống.WELD-001408 Các phụ thuộc không hài lòng khi tiêm EJB thực hiện giao diện

Tôi đã nhận được các giao diện sau:

public interface Parent { } 
public interface ChildOne extends Parent { } 
public interface ChildTwo extends Parent { } 

và 2 EJB:

@Stateless 
public class FirstBean implements ChildOne { } 

@Stateless 
public class SecondBean implements ChildTwo { } 

Và cũng này CDI Bean:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @Inject 
    private FirstBean firstBean; 

    @Inject 
    private SecondBean secondBean; 
} 

Trong khi cố gắng để triển khai này trên Glassfish 3.1 Tôi nhận được ngoại lệ sau:

Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:305) 

Khi cả hai EJB thực hiện giao diện Parent, ngoại lệ là như nhau.
Ngoài ra, tôi đã thử thêm vòng loại, nhưng điều đó không thay đổi bất cứ điều gì.

Trả lời

20

Tôi chỉ chơi xung quanh với cấu trúc của bạn, đọc một chút của mối hàn docu và phát hiện ra những điều sau đây.

Bạn đang sử dụng EJB triển khai giao diện, do đó không thể xem giao diện không có (rõ ràng), nhưng bạn đang cố gắng truy cập trực tiếp vào triển khai. Ngay sau khi bạn tuyên bố nó như là một EJB bạn phải ghi nhớ các quy ước. Vì vậy, nếu bạn định nghĩa một giao diện, bạn phải sử dụng nó để truy cập vào EJB. Thay đổi nó vào sau, nên làm việc ra:

@Inject 
private ChildOne firstBean; 

Tiếp cận việc thực hiện mặc dù một giao diện được định nghĩa là chỉ có thể cho đồng bằng Đậu CDI Managed (lớp mà không có @ Stateless/@ chú thích Stateful). Vì vậy, loại bỏ chú thích của bạn và nó sẽ hoạt động.

Chỉ để biết thông tin của bạn, nếu bạn đang sử dụng Glassfish. Nếu bạn gắn bó với các EJB và cố gắng truy cập vào phương thức giao diện cha mẹ, bạn sẽ gặp phải lỗi this.

+0

Cảm ơn một tấn! Lời giải thích thực sự tốt! Và tôi đã va vào ngoại lệ đó 'Không thể chuyển đổi ejbRef cho ejb ...', tôi không biết đó là vấn đề đã biết. – jFrenetic

+0

Tôi đã kiểm tra lại một lần nữa. Tôi đã cố gắng tiêm các EJB đó bằng tham chiếu giao diện như bạn đã đề xuất.Và tôi vẫn nhận được điều này "Không phụ thuộc vào sự phụ thuộc ..." ngoại lệ trong quá trình triển khai. Tôi thậm chí còn chú thích các giao diện với @Local. Nó vẫn không hoạt động. – jFrenetic

+0

Tôi đã thử nó ngày hôm qua và nó làm việc cho tôi, hơn nữa nó làm cho khá một chút ý nghĩa. Dù sao, tôi sẽ thử lại khi tôi trở về nhà. –

0

Bạn đã thử sử dụng chú thích @EJB thay vì chú thích CDI @inject chưa?

Ví dụ:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @EJB 
    private FirstBean firstBean; 

    @EJB 
    private SecondBean secondBean; 
} 
+0

Không, tôi không có. Cảm ơn ý tưởng, nhưng tôi thực sự muốn hiểu những gì tôi đang làm sai ở đây. – jFrenetic

+0

Bạn có bean.xml trong META-INF không? –

+0

Tôi chắc chắn. Nếu tôi không có nó, thì WELD sẽ không phát hiện các hạt CDI của tôi và sẽ không thực hiện xác thực trong quá trình triển khai. – jFrenetic

6

Muộn còn hơn không bao giờ:

chú thích các SLSB aditionally với @LocalBean công trình cho tôi với JBoss AS 7.1.1. Tôi không thích ý tưởng tạo giao diện không có giá trị gia tăng.

Sử dụng ví dụ của bạn:

@Stateless 
@LocalBean 
public class FirstBean implements ChildOne { } 

@Stateless 
@LocalBean 
public class SecondBean implements ChildTwo { } 
+0

@atamanroman , bạn có biết nếu phương pháp đó là di động không? Bởi vì định nghĩa cho '@ LocalBean' là" Chỉ định rằng một ** session ** bean cho thấy một giao diện không có giao diện "và vì nó không phải là một phiên" "đậu ở đây, nó sẽ làm việc ở khắp mọi nơi và nó là điều đúng để làm gì? –

+1

@AnthonyO. đậu phiên không trạng thái và đậu phiên trạng thái là cả hai phiên bean. Vì vậy, có, điều này là chính xác như là tiêu chuẩn đòi hỏi. – atamanroman

+0

Nó cũng hoạt động cho JBoss 6.1.0 – Ste

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