代码之家  ›  专栏  ›  技术社区  ›  Diego Magalhães

将对象会话到Seam拦截器中

  •  0
  • Diego Magalhães  · 技术社区  · 15 年前

    我又一次来这里寻求有关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;
    

    因为Seam域没有进入拦截器,所以无法工作。那么,如何注入登录方法上设置的会话属性,如下所示:

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

    在authenticator类上。

    事先谢谢。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Diego Magalhães    15 年前

    答案是:

    // Inicializa o EM fora do escopo do SEAM
    em = (EntityManager) Component.getInstance("entityManager");
    
    // Recupera o usuário logado
    usuario = (Usuario) Contexts.getSessionContext().get("usuario");
    

    两种非喷射

    :)