2011-11-30 14 views
8

tôi sử dụng Java EE 5. Tôi đã viết một đánh chặn cho tất cả các EJB với ba phương pháp để khai thác gỗ:Làm thế nào để có được tên Invoker trong phương pháp kiện vòng đời EJB đánh chặn của

public class DefaultInterceptor { 
    public static final String PREFIX = "!!!!!!!!!Interceptor:"; 

    @PostConstruct 
    public void postConstruct(InvocationContext ctx) { 
     try { 
      System.out.println(PREFIX + " postConstruct"); 
     } catch (Exception ex) { 
      throw new RuntimeException(ex); 
     } 
    } 

    @PreDestroy 
    public void preDestroy(InvocationContext ctx) { 
     try { 
      System.out.println(PREFIX + " predestroy"); 
      System.out.println(PREFIX + "ctx.preceed=" + ctx.proceed()); 
     } catch (Exception ex) { 
      throw new RuntimeException(ex); 
     } 
    } 

    @AroundInvoke 
    public Object intercept(InvocationContext ctx) throws Exception { 
     System.out.println(PREFIX + "method invocation '" + ctx.getMethod().getName() + "'"); 
     System.out.println(PREFIX + "parameters ='" + Arrays.deepToString(ctx.getParameters()) + "'"); 
     System.out.println(Arrays.deepToString(ctx.getContextData().keySet().toArray())); 
     Object result = null; 
     try { 
      result = ctx.proceed(); 
      System.out.println(PREFIX + "Method result='" + result + "'"); 
      return result; 
     } catch (Exception ex) { 
      System.out.println(PREFIX + "Method exception ='" + ex.getMessage() + "'"); 
      throw ex; 
     } finally { 
      System.out.println(PREFIX + "Method finished"); 
     } 
    } 
} 

Tôi muốn có được tên của EJB mà được gọi là interceptor này. Tôi làm nó như thế nào?

Tôi đã thử ctx.getMethod().getDeclaringClass().getSimpleName() nhưng ctx.getMethod() trả về null trong các phương thức postConstruct(-)predestroy(-).

+0

Lệnh 'ctx.getMethod()' trả về null hoặc 'ctx' ** được ** null? –

+0

@Piotr Nowicki ctx.getMethod() trả về luôn null trong callbacks vòng đời. –

+0

@MikkoMaunu yeah, tôi biết rằng nó được gọi bởi container, không phải là phương pháp invoker. Tôi đã quan tâm nhiều hơn rằng phương thức gọi lại vòng đời có thể lấy tham số 'InvocationContext', nhưng tôi đã quên rằng các Interceptor có thể :-) –

Trả lời

4

Đối với cuộc gọi lại vòng đời ctx.getMethod() trả về giá trị rỗng. Đây là tài liệu ví dụ ở đây: http://docs.oracle.com/javaee/5/api/javax/interceptor/InvocationContext.html

Đó là vì vậy, bởi vì nó không phải là EJB của bạn, nhưng container gọi phương thức gọi lại vòng đời.

Nếu bạn quan tâm về sự liên kết giữa interceptor và bean nó thuộc về, phương thức ctx.getTarget() có phục vụ mục đích của bạn không?

+1

' context.getMethod() 'thực sự trả về phương thức đích, không phải là người gọi. Và anh ta hỏi "Tôi muốn lấy tên EJB gọi là kẻ đánh chặn này". – Jaumzera

0

On WebLogic Server, bạn có thể sử dụng trong postConstructor, vv, để có được những tên EJB:

ctx.getTarget().getClass().getSuperclass().getName(); 
Các vấn đề liên quan