java - 将 session 对象放入 Seam 拦截器中

标签 java seam aop interceptor

我再次在这里寻求有关接缝主题的帮助。

目前我们有以下拦截器用于审计

@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;

不起作用,因为接缝域不会进入拦截器。那么如何注入(inject)在登录方法上设置的 session 属性:

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

在 validator 类上。

提前致谢。

最佳答案

答案需要是:

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

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

均关闭注入(inject)

:)

关于java - 将 session 对象放入 Seam 拦截器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1234598/

相关文章:

java - ArrayList 在从谷歌数据存储区检索时抛出异常(使用 gwt、java)

java - :inputText value inside rich:modalPanel not binding to backing bean

linux - Seam 上的 Linux 问题

c - 预期声明说明符错误?

java - 编织一个没有接口(interface)和非公共(public)方法的类时关于理解Spring AOP的问题

Spring AOP : passing target to Aspect

java - JfreeCharts 为 XYBarchart 指定特定宽度

Java方法返回数组

java - 如何在camel配置中定义公共(public)路由体?

java - JSF/接缝 : How to download and print a dynamically generated PDF file without user intervention?