3 votes

Intercepteur @PostConstruct avec @Named @ViewScoped non invoqué

J'ai lu attentivement l'article sur Intercepteurs dans la documentation Seam/Weld et a mis en place un système de gestion de la qualité. InterceptorBinding :

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

et un Interceptor classe :

@MyLog @Interceptor
public class ErpLogInterceptor implements Serializable
{
  @AroundInvoke
  public Object logMethodEntry(InvocationContext invocationContext) throws Exception
  {..}

  @PostConstruct
  public Object logPostConstruct(InvocationContext invocationContext) throws Exception
  {...}
}

Non, j'ai essayé d'activer l'intercepteur dans le fichier @Named @ViewScoped haricot :

@javax.inject.Named;
@javax.faces.bean.ViewScoped
public class MyBean implements Serializable
{
  @PostConstruct @MyLog
  public void init()
  {...}

  @MyLog public void toggleButton()
  {..}
}

Si j'appuie sur un bouton dans ma page JSF, la méthode toggleButton est invoqué correctement et la méthode Interceptor logMethodEntry est appelé. Mais il semble que la méthode @PostConstruct (qui m'intéresse) n'est jamais interceptée par ma classe.

La question semble être liée à Intercepteurs Java EE et bean @ViewScoped mais en fait mon intercepteur fonctionne dans normal des méthodes.

1voto

A.Panzer Points 246

Vous devez définir le type de retour de @PostConstruct à l'intercepteur void pas Object . Modifier :

  @PostConstruct
  public Object logPostConstruct(InvocationContext invocationContext) throws Exception
  {...}

à :

  @PostConstruct
  public void logPostConstruct(InvocationContext invocationContext) throws Exception
  {...}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X