2011-11-30 23 views
8

używam Java EE 5. Napisałem przechwytywania dla wszystkich EJB z trzech metod rejestrowania:Jak uzyskać nazwę użytkownika wywołującego w metodzie zdarzeń cyklu EJB Interceptor za

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"); 
     } 
    } 
} 

Chcę uzyskać nazwę EJB, które nazwał ten przechwytujący. Jak mogę to zrobić?

Próbowałem ctx.getMethod().getDeclaringClass().getSimpleName() ale ctx.getMethod() Przywraca null w postConstruct(-) i predestroy(-) metod.

+0

Opcja 'ctx.getMethod()' zwraca null lub 'ctx' ** ** jest NULL? –

+0

@Piotr Nowicki ctx.getMethod() zwraca zawsze null w wywołaniach zwrotnych cyklu życia. –

+0

@MikkoMaunu tak, wiem, że jest wywoływana przez kontener, a nie przez metodę invoker. Byłem bardziej zainteresowany tym, że metoda wywołania zwrotnego cyklu życia może przyjmować parametr 'InvocationContext', ale zapomniałem, że Interceptor może :-) –

Odpowiedz

4

Dla wywołań cyklu życia ctx.getMethod() zwraca wartość null. Zostało to udokumentowane na przykład tutaj: http://docs.oracle.com/javaee/5/api/javax/interceptor/InvocationContext.html

Jest tak, ponieważ nie jest to EJB, ale kontener, który wywołuje metody wywołania zwrotnego cyklu życia.

Jeśli interesuje Cię związek między przechwytywaczem i komponentem bean, do którego należy, to czy metoda ctx.getTarget() nie służy do tego celu?

+1

' context.getMethod() 'faktycznie zwraca metodę docelową, a nie wywołującego. Zapytał: "Chcę uzyskać nazwę EJB, która nazwała ten przechwytujący". – Jaumzera

0

Na serwerze WebLogic można wykorzystać to w postConstructor, etc, aby uzyskać nazwę EJB:

ctx.getTarget().getClass().getSuperclass().getName();