2012-10-11 83 views
6

我正在使用JBoss 7.1構建Java EE應用程序。Java EE攔截器和@ViewScoped bean

爲了獲得對用戶操作的全面審計,我打算使用攔截器來記錄我的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 

我有一個問題在於這樣一個事實:這個註釋沒有目標類型的方法,它的感覺阻止我的攔截器攔截對類方法的調用。

有沒有人有過同樣的問題?有人知道是否可以擴展bean的範圍,以便在不改變@ViewScoped的性質的情況下攔截它的方法?

回答

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