Как получить имя вызывающего в методе события жизненного цикла перехватчика EJB - PullRequest
8 голосов
/ 30 ноября 2011

Я использую Java EE 5. Я написал перехватчик для всех EJB с тремя методами ведения журнала:

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

Я хочу получить имя EJB, которое вызвало этот перехватчик.Как я могу это сделать?

Я пытался ctx.getMethod().getDeclaringClass().getSimpleName(), но ctx.getMethod() возвращает null в postConstruct(-) и predestroy(-) методах.

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Для обратных вызовов жизненного цикла ctx.getMethod () возвращает ноль.Это задокументировано, например, здесь: http://docs.oracle.com/javaee/5/api/javax/interceptor/InvocationContext.html

Это так, потому что не ваш EJB, а контейнер вызывает методы обратного вызова жизненного цикла.

Если вы заинтересованы в связи между перехватчиком иbean-компоненту, которому он принадлежит, разве метод ctx.getTarget () не служит вашей цели?

0 голосов
/ 23 апреля 2013

На сервере WebLogic вы можете использовать это в postConstructor и т. Д., Чтобы получить имя EJB:

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