2010-07-07 28 views
11

Tôi muốn viết đoạn mã này:Tiêm EJB tĩnh, vô nghĩa?

@Stateless 
public class MyEjb 
{ 
    @EJB 
    private static MyOtherEjbWhichIWantStatic myOtherEjb; 
} 

Nó làm cho ý nghĩa với tôi, mà tôi muốn tiêm một EJB trong lớp học của tôi, là một yếu tố tĩnh, vì lý do khác nhau.

Java không phải là rất hạnh phúc với điều đó không may

com.sun.enterprise.container.common.spi.util.InjectionException: Illegal use of static field private static MyOtherEjbWhichIWantStatic myOtherEjb on class that only supports instance-based injection 

Tôi không nhận được nó, tại sao tôi không thể tiêm một EJB tĩnh vào EJB khác?

Trả lời

26

Khi người khác chỉ ra, điều này không được phép theo đặc điểm kỹ thuật và phiên bản ngắn là chú thích @EJB chỉ được hỗ trợ cho các thành viên tĩnh trong các lớp có chức năng main() (xem đặc tả EJB 3.0 và ngăn chứa ứng dụng khách ).

Tại sao lại như vậy? Trước hết, đọc/ghi các trường tĩnh hoàn toàn bị cấm trong EJBs (đây là một phần của hạn chế EJB).Từ Why can't I use nonfinal static fields in my enterprise bean?

các trường lớp tĩnh Nonfinal là không được phép trong EJB vì lĩnh vực làm cho một doanh nghiệp đậu khó hoặc không thể phân phối. Các trường lớp tĩnh được chia sẻ giữa tất cả các cá thể của một lớp cụ thể, nhưng chỉ trong một Máy ảo Java (JVM) đơn. Việc cập nhật một trường tĩnh bao hàm ý định chia sẻ giá trị của trường trong tất cả các trường hợp của lớp. Nhưng nếu một lớp đang chạy trong một số JVM cùng một lúc, chỉ những cá thể chạy trong cùng một JVM như cá thể cập nhật mới có quyền truy cập vào giá trị mới. Nói cách khác, một trường tĩnh nonfinal sẽ hoạt động khác nếu chạy trong một JVM đơn lẻ, hơn là nó sẽ chạy trong nhiều JVM. Thùng chứa EJB bảo lưu tùy chọn phân phối các bean doanh nghiệp trên nhiều JVM (chạy trên cùng một máy chủ hoặc trên bất kỳ nhóm máy chủ nào). Các trường lớp tĩnh không phải là không được phép vì các cá thể bean nghiệp vụ sẽ hoạt động khác nhau tùy thuộc vào việc chúng có được phân phối hay không.

Thực tiễn có thể chấp nhận là sử dụng các trường lớp tĩnh nếu các trường đó được đánh dấu là final. Vì các trường cuối cùng không thể được cập nhật, các cá thể của bean doanh nghiệp có thể được phân phối bởi vùng chứa mà không quan tâm đến các giá trị của các trường đó trở nên không đồng bộ.

Nhưng trong khi sử dụng các trường tĩnh chỉ đọc được cho phép, điều này sẽ không phù hợp với EJB. EJB không quốc tịch có thể được gộp lại, một thùng chứa có thể quyết định tiêu diệt chúng (đây là cách triển khai cụ thể) và bạn muốn cho phép vùng chứa chọn trường hợp bạn sẽ sử dụng, đặc biệt trong môi trường phân tán. Nói cách khác, không bao giờ giả sử bạn bị ràng buộc với một trường hợp cụ thể.

Vì vậy, ở cuối, vâng, đây là một điều vô nghĩa.

+0

Tinh thể rõ ràng, cảm ơn bạn! –

0

Từ việc chèn đặc tả Java EE 5 của các EJB tĩnh chỉ được phép trong các lớp chính của ứng dụng khách.

Đối với tất cả các lớp ngoại trừ lớp chính của ứng dụng khách, trường hoặc phương thức không được tĩnh. Bởi vì các ứng dụng khách sử dụng cùng vòng đời như các ứng dụng J2SE, không có cá thể nào của lớp ứng dụng khách ứng dụng chính được tạo ra bởi thùng chứa ứng dụng khách. Thay vào đó, phương thức main tĩnh được gọi. Để hỗ trợ việc tiêm cho lớp chính của ứng dụng khách, các trường hoặc các phương thức được chú thích để tiêm phải là tĩnh.

1

Tôi không nhận được nó, tại sao tôi không thể tiêm một EJB tĩnh vào EJB khác?

the spec không cho phép nó:

5.2.3Annotations và tiêm

Như đã trình bày trong phần sau , một lĩnh vực hoặc phương pháp nhất định lớp thành phần chứa quản lý có thể được chú thích để yêu cầu mục nhập từ môi trường của thành phần ứng dụng được chèn vào int o lớp học . [...] Đối với tất cả các lớp ngoại trừ các lớp chính của ứng dụng khách, các trường hoặc phương thức không được là tĩnh.

Lưu ý rằng ngoại lệ (lớp ứng dụng khách ứng dụng) chỉ tồn tại vì các lớp đó không bao giờ được khởi tạo. Về cơ bản, các trường tĩnh thường có vấn đề, và gấp đôi như vậy trong một máy chủ ứng dụng, vì chúng có thể phá vỡ sự phân tách các luồng xử lý và các giao dịch yêu cầu, đó là toàn bộ điểm sử dụng một máy chủ ứng dụng ngay từ đầu.

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