我正在使用 JBoss 7.1 构建 Java EE 应用程序。
为了对用户操作进行全面审核,我计划使用拦截器来记录对我的 bean 方法的每次调用。
为此,我有以下要求:
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Logged {
}
然后我定义我的拦截器类:
@Logged
@Interceptor
public class UserActionInterceptor implements Serializable {
private static final long serialVersionUID = 1L;
private Logger log = LoggerFactory.getLogger(UserActionInterceptor.class);
public UserActionInterceptor() {
}
@AroundInvoke
public Object logMethodEntry(InvocationContext invocationContext) throws Exception {
log.debug(invocationContext.getMethod().getName() + " invoked.");
return invocationContext.proceed();
}
}
到目前为止,这工作正常。如果我使用这个拦截器绑定一个类,我会得到一些日志记录。但是,当我想针对我的 bean 类时,它会变得更加棘手。
如果我有一个 @RequestScoped 类型的 bean 并将它绑定到我的拦截器,它就可以工作。但是,如果我有一个 @ViewScoped 类型的 bean,那么它不会。
我查找了@ViewScoped 的定义,发现:
@Retention(value=RUNTIME)
@Target(value=TYPE)
@Inherited
public @interface ViewScoped
我觉得问题在于这个注释没有目标类型 METHOD并且它阻止我的拦截器拦截对类方法的调用。
以前有人遇到过同样的问题吗?有人知道是否可以扩展 bean 的范围,以便可以在不改变 @ViewScoped 的性质的情况下拦截其方法?