2012-01-29 13 views
7

Cho đến nay, tôi hầu như luôn làm việc với các EJB không có giao diện và hiểu một chút về nhu cầu chú thích @Local. Hãy xem xét ví dụ này:EJB 3.1. Chú thích @Local có cần thiết không?

public interface MyBeanIntf { void doStuff(); } 

@Stateless 
public class MyBean implements MyBeanIntf { public void doStuff(){ } } 

Nếu MyBeanIntf được đánh dấu là @Local? Tôi không thấy bất kỳ lợi ích từ đó, bởi vì ngay cả khi tôi không chú thích nó như @Local, tôi vẫn có thể sử dụng DI để tiêm đúng nó vào điều khiển UI:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    // injection works perfectly, even when MyBeanIntf is not marked as @Local 
    @Inject 
    private MyBeanIntf myBean; 

    // or even like this: 
    // @EJB 
    // private MyBeanIntf myBean; 

} 

Hãy làm cho nó phức tạp hơn:

public interface MyBeanIntf { void doStuff(); } 
public class MySuperBean implements MyBeanIntf { public void doStuff() { } } 

@Stateless 
public class MyBean extends MySuperBean { } 

Có phải MyBean hiện được coi là hợp lệ Local EJB? Tôi có một số nghi ngờ bởi vì nó thực hiện các giao diện gián tiếp.

Trả lời

8

Nếu EJB của bạn thực hiện một số giao diện nhưng bạn không chỉ định (không phải trên EJB và chính giao diện) mà giao diện đó là (@Remote, @Local) so với giả định rằng nó là @Local one.

Do đó mã của bạn:

public interface MyBeanIntf { void doStuff(); } 

@Stateless 
public class MyBean implements MyBeanIntf { public void doStuff(){ } } 

là ngữ nghĩa giống hệt như sau:

@Local 
public interface MyBeanIntf { void doStuff(); } 

@Stateless 
public class MyBean implements MyBeanIntf { public void doStuff(){ } } 

Khi nói đến phần thứ hai của câu hỏi của bạn, tôi nghĩ rằng phần 4.9.2.1 Session Bean Superclasses từ EJB 3.1 FR spec sẽ rất thú vị đối với bạn. Từ hiểu biết của tôi (vì vậy nó có thể không chính xác), có vẻ như đậu của bạn không nên được coi là phơi bày một giao diện địa phương có giá trị vì của đoạn trích sau đây:

@Stateless 
public class A implements Foo { ... } 

@Stateless 
public class B extends A implements Bar { ... } 

Giả sử Foo và Bar là giao diện doanh nghiệp địa phương và không có bộ mô tả triển khai liên quan, bean phiên A cho thấy giao diện doanh nghiệp địa phương Foo và phiên B cho thấy doanh nghiệp địa phương giao diện Bar, nhưng không phải Foo.

Đậu phiên B sẽ cần bao gồm rõ ràng Foo trong bộ số lượt xem được hiển thị của giao diện đó để áp dụng.

Cập nhật:

Như một sự bổ sung một đoạn trích thêm từ spec:

Một phiên lớp bean được phép có superclasses có tự lớp session bean. Tuy nhiên, không có quy tắc đặc biệt áp dụng cho việc xử lý chú thích hoặc triển khai mô tả cho trường hợp này. Với mục đích xử lý một lớp bean phiên cụ thể, tất cả xử lý siêu lớp giống hệt nhau bất kể liệu các lớp siêu lớp có phải là các lớp bean phiên hay không.

+0

Cảm ơn câu trả lời. Đối với liên kết đến đặc điểm kỹ thuật, tôi vẫn còn một số nghi ngờ. Nó thảo luận một cách rõ ràng về các siêu lớp, đó là các bean phiên. Nhưng nếu chúng chỉ là các lớp trừu tượng mà không có chú thích '@ Stateless' hoặc' @ Stateful' thì sao? – jFrenetic

+0

Chắc chắn, tôi không chắc chắn về điều đó trong 100%, nhưng hãy xem bài đăng đã chỉnh sửa - có thể nó sẽ giúp ích. –

+1

Cảm ơn sự nhấn mạnh. Tôi đọc phần đó trong bản thân, nhưng bằng cách nào đó đã bỏ qua nó. – jFrenetic