2011-11-30 12 views
8

Io uso di Java EE 5. Ho scritto un intercettore per tutti gli EJB con tre metodi per la registrazione:Come ottenere il nome invoker nel metodo di evento del ciclo di vita EJB di intercettore

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

voglio ottenere il nome di EJB che chiamato questo intercettore. Come posso farlo?

ho cercato ctx.getMethod().getDeclaringClass().getSimpleName() ma ctx.getMethod() rendimenti null in postConstruct(-) e predestroy(-) metodi.

+0

Il 'ctx.getMethod()' restituisce NULL o il 'ctx' ** ** è nullo? –

+0

@Piotr Nowicki ctx.getMethod() restituisce sempre null nei callback del ciclo di vita. –

+0

@MikkoMaunu sì, so che è chiamato dal contenitore, non dal metodo invocatore. Ero più interessato al fatto che il metodo callback del ciclo di vita potesse prendere il parametro 'InvocationContext', ma ho dimenticato che quelli di Interceptor possono :-) –

risposta

4

Per le callback del ciclo di vita ctx.getMethod() restituisce null. Questo è documentato per esempio qui: http://docs.oracle.com/javaee/5/api/javax/interceptor/InvocationContext.html

Questo è vero, perché non è il tuo EJB, ma il contenitore che chiama i metodi di callback del ciclo di vita.

Se ti interessa l'associazione tra l'intercettore e il bean a cui appartiene, il metodo ctx.getTarget() non è al tuo servizio?

+1

' context.getMethod() 'restituisce il metodo di destinazione, non l'invoker. E ha chiesto "Voglio ottenere il nome di EJB che ha chiamato questo intercettore". – Jaumzera

0

Nel server WebLogic è possibile utilizzare questo in postConstructor, ecc, per ottenere il nome EJB:

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