2012-10-11 4 views
6

Je construis une application Java EE en utilisant JBoss 7.1.Java EE et Interceptor @ViewScoped haricots

Afin d'obtenir une vérification complète des actions de l'utilisateur, je suis planing d'utiliser Interceptor pour se connecter chaque invocation des méthodes de mes haricots.

Pour ce faire, je l'Biding suivante:

@Inherited 
@InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD, ElementType.TYPE}) 
public @interface Logged { 
} 

Je définit ma classe intercepteur:

@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(); 
    } 
} 

Jusqu'à présent, cela fonctionne bien. Si je lie une classe en utilisant cet Interceptor, j'obtiens un enregistrement. Cependant, il devient plus difficile quand je veux cibler mes classes de haricots.

Si j'ai un bean de type @RequestScoped et le lier à mon intercepteur cela fonctionne. Toutefois, si j'ai un bean de type @ViewScoped, alors il n'est pas.

Je regardais la définition de @ViewScoped et je l'ai trouvé:

@Retention(value=RUNTIME) 
@Target(value=TYPE) 
@Inherited 
public @interface ViewScoped 

J'ai le sentiment que le problème réside dans le fait que cette annotation ne pas le type de cible MÉTHODE et que empêche mon intercepteur d'intercepter les appels aux méthodes de classe.

Quelqu'un at-il eu le même problème avant? Est-ce que quelqu'un sait s'il est possible d'étendre la portée du grain afin que ses méthodes peuvent être interceptées sans changer la nature du @ViewScoped?

Répondre

3

Cela se produit parce que l'intercepteur ne peut pas accéder au @ManagedBean. @ViewScope ne fait pas partie du CDI et est livré avec des beans JSF.

Pour le faire fonctionner, la meilleure façon est d'utiliser @ViewScoped avec CDI en utilisant l'une des extensions qui le fournit. Vos options incluent MyFaces CODI et Seam 3 (par exemple).

Je l'ai obtenu ce travail (de la même façon que vous décrivez) en installant MyFaces CODI et en utilisant les annotations suivantes avec ces importations:

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

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