如何在EJB拦截器的生命周期事件方法中获取调用者名称

时间:2011-11-30 11:56:42

标签: java ejb-3.0 interceptor

我使用的是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()nullpostConstruct(-)方法中返回predestroy(-)

2 个答案:

答案 0 :(得分:4)

对于生命周期回调,ctx.getMethod()返回null。例如,这里记录了这一点:http://docs.oracle.com/javaee/5/api/javax/interceptor/InvocationContext.html

就是这样,因为它不是你的EJB,而是调用生命周期回调方法的容器。

如果你对它所属的拦截器和bean之间的关联感兴趣,ctx.getTarget()方法不能满足你的目的吗?

答案 1 :(得分:0)

在WebLogic服务器上,您可以在postConstructor等中使用它来获取EJB名称:

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