2009-08-05 35 views
0

再次我在這裏要求幫助接縫主題。會話對象進入Seam攔截器

目前我們已經審計

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

} 

以下攔截器和攔截器本身

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

我推測

@In(required = false) 
    Usuario usuario; 

不會起作用,因爲縫域不進入攔截器。那麼我如何注入登錄方法中設置的會話屬性:

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

對於驗證器類。

在此先感謝。

回答

2

答案需求是:

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

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

都關閉注射

:)