我使用的是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(-)
。
答案 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();