2009-08-05 15 views
0

une fois de plus je suis ici demander de l'aide sur le sujet de couture.Objets de session dans Intercepteurs de couture

Actuellement, nous avons l'intercepteur suivant pour vérification

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Interceptors(LoggingInterceptor.class) 
public @interface IAuditavel { 

} 

et l'intercepteur lui-même

private EntityManager em; 

    @Logger 
    private Log logger; 

    @In(required = false) 
    Usuario usuario; 

    @AroundInvoke 
    public Object aroundInvoke(InvocationContext ctx) throws Exception { 
     if (ctx.getMethod().isAnnotationPresent(IAuditavel.class) || isInterceptorEnabled()) { 
      // Inicializa o EM fora do escopo do SEAM 
      em = (EntityManager) Component.getInstance("entityManager"); 

      // Entidade para logging 
      LogEntidade entidade = new LogEntidade(); 

      // Chave 0 
      entidade.setIdLog(new BigDecimal(0)); 

      // Metodo chamado 
      entidade.setAcao(ctx.getTarget().getClass().getSimpleName() + "." + ctx.getMethod().getName()); 

      // Usuario logado no momento 
      entidade.setUsuario(usuario); 

      // Parametros 
      Object[] params = ctx.getParameters(); 
      StringBuilder sb = new StringBuilder(""); 

      for (Object o : params){ 
       sb.append(o + ", "); 
      } 

      // Data da execução 
      entidade.setDataAlteracao(new Date()); 

      // Salva e desconecta a entidade 
      em.persist(entidade); 
      em.flush(); 

      // Põe os valores da entidade no log do jboss 
      saveToServerLog(entidade); 
     } 

     // Continua a execução do método interceptado 
     return ctx.proceed(); 
    } 

    /*** 
    * Retorna true caso a classe/método seja anotada com o nosso interceptor 
    */ 
    public boolean isInterceptorEnabled() { 
     return getComponent().beanClassHasAnnotation(IAuditavel.class); 
    } 

    public void saveToServerLog(LogEntidade entidade) { 
     if (logger.isInfoEnabled()) { 
      logger.info("> " + entidade.getDataAlteracao() + ":" 
        + entidade.getAcao() + " com os parametros : " 
        + entidade.getParametros()); 
     } 
    } 

Je présume que le

@In(required = false) 
    Usuario usuario; 

ne fonctionnera pas car le domaine de la couture ne pas entrer dans l'intercepteur. Alors, comment puis-je injecter un attribut de session défini sur la méthode de connexion comme:

@In(required = false) 
    @Out(scope = ScopeType.SESSION, required = false) 
    Usuario usuario; 

sur la classe d'authentification.

Merci d'avance.

Répondre

2

Le besoin de réponse a été:

// Inicializa o EM fora do escopo do SEAM 
em = (EntityManager) Component.getInstance("entityManager"); 

// Recupera o usuário logado 
usuario = (Usuario) Contexts.getSessionContext().get("usuario"); 

à la fois de l'injection

:)