2013-03-18 31 views
6

Giả sử tôi có một EJB xác định hai quan điểm:Tìm hiểu những gì nhìn EJB được sử dụng

  • doanh nghiệp địa phương,
  • kinh doanh từ xa.

Cả hai giao diện chia sẻ chữ ký phương pháp tương tự, vì vậy nó giống như:

public interface MyBusinessCommon { 
    void myMethod(Object o); 
} 

@Local 
public interface MyBusinessLocal extends MyBusinessCommon { } 

@Remote 
public interface MyBusinessRemote extends MyBusinessCommon { } 

@Stateless 
public class MyBusinessBean implements MyBusinessLocal, MyBusinessRemote { 
    public void myMethod(Object o) { 
     // ... 
    } 
} 

Có cách nào để tìm ra những gì nhìn EJB được gọi từ bên trong EJB tự (hoặc đánh chặn của nó?)

Giả sử tôi muốn thực hiện các quy trình ủy quyền khác nhau tùy thuộc vào chế độ xem được sử dụng. Điều khiển từ xa nên hạn chế hơn và không nên sử dụng cục bộ.

Tôi có thể gọi SessionContext#getInvokedBusinessInterface() nhưng điều này chỉ cho tôi thông tin về đối tượng lớp - không phải về ngữ nghĩa EJB của nó. Sử dụng sự phản chiếu để kiểm tra sự hiện diện của chú thích trên giao diện hoặc đậu là không đủ (những gì về khung nhìn được xác định trong ejb-jar.xml?)

Tôi nghi ngờ có thể sử dụng đặc tả EJB thẳng.

Nếu không, bạn có thể nhận thông tin này từ người dùng máy chủ ứng dụng không? (chúng ta hãy xem xét chỉ JBoss AS 7.x, Glassfish 3.x và TomEE 1.5.1).

+1

Cảm giác ruột của tôi nói điều này không thể thực hiện được theo cách di động. Nếu có, tôi đã bỏ lỡ một cái gì đó quá. Một thủ thuật có thể là sử dụng quy ước đặt tên giao diện. Bạn đã làm điều đó; 'MyBusinessLocal' kết thúc bằng' Local' etc. Một chút giòn, nhưng các quy ước làm việc cho ví dụ: JavaBeans. –

+0

Cảm ơn Arjan. Tôi đồng ý - một số quy ước có thể là một giải pháp ở đây. Tôi đoán việc nhận dạng khung nhìn EJB có thể chỉ có thể sử dụng nội bộ máy chủ ... Nếu có thể! –

+0

Bạn được chào đón. Nếu bạn cảm thấy mạnh mẽ về EJB cần khả năng này, thì tại sao không thêm một yêu cầu tính năng cho nó tại http://java.net/jira/browse/EJB_SPEC? –

Trả lời

0

Giống như Arjan đã nói - không thể thực hiện được bằng cách làm theo thông số EJB.

Tuy nhiên, trong Glassfish nó khá đơn giản để làm.

Tất cả các thiết bị chặn EJB chấp nhận tham số InvocationContext. InvocationContext thực hiện trong Glassfish là trong thực tế com.sun.ejb.EjbInvocation lớp. Trường có trường isLocal thông báo cho bạn biết nếu nó chặn cuộc gọi doanh nghiệp địa phương (hoặc isRemote cho các cuộc gọi doanh nghiệp từ xa). Bạn có thể sử dụng nó, ví dụ: như sau:

import com.sun.ejb.EjbInvocation; 

import javax.interceptor.AroundInvoke; 
import javax.interceptor.Interceptor; 
import javax.interceptor.InvocationContext; 

@Interceptor 
public class CallSourceAwareInterceptor { 

    @AroundInvoke 
    public Object aroundInvoke(InvocationContext ictx) throws Exception { 
     boolean isLocalCall = isLocalEJBCall(ictx); 

     return ictx.proceed(); 
    } 

    boolean isLocalEJBCall(final InvocationContext ictx) { 
     if (ictx instanceof EjbInvocation) { 
      return ((EjbInvocation) ictx).isLocal; 
     } 
     else { 
      throw new IllegalArgumentException("Unknown InvocationContext implementation."); 
     } 
    } 
} 

Để truy cập EjbInvocation lớp Glassfish nội bộ này, bạn cần phải thêm sau maven phụ thuộc:

<dependency> 
    <groupId>org.glassfish.main.ejb</groupId> 
    <artifactId>ejb-container</artifactId> 
    <version>4.0.1-b02</version> 
    <scope>provided</scope> 
</dependency> 

Và bạn có thể cần phải thêm sau kho cụ thể để có được quyền truy cập vào hiện tượng này:

<repositories> 
    <repository> 
     <id>maven-promoted</id> 
     <url>https://maven.java.net/content/groups/promoted/</url> 
    </repository> 
</repositories> 

Tôi đã nghiên cứu nhanh (dựa trên gợi ý của Richard về đối tượng Invocation) cách đạt được điều tương tự trong JBoss nhưng không thể vây d trả lời ...