Java EE拦截器和@ViewScoped bean

时间:2012-10-11 14:00:34

标签: java-ee logging jboss interceptor

我正在使用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的性质?

2 个答案:

答案 0 :(得分:3)

这是因为拦截器无法访问@ManagedBean。 @ViewScope不是CDI的一部分,它带有JSF bean。

为了使其工作,最可靠的方法是使用带有CDI的@ViewScoped,使用其中一个提供它的扩展。您的选项包括MyFaces CODI和Seam 3(例如)。

我通过安装MyFaces CODI并对这些导入使用以下注释来使其工作(与描述相同):

import javax.faces.bean.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
@Interceptors({ MyInterceptor.class})

答案 1 :(得分:0)

或者您可以尝试这个好主题http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/Steven Verborgh解释如何使用CDI扩展来创建自己的ViewScope。