将会话对象放入 Seam 拦截器中

发布于 2024-07-30 10:02:22 字数 2485 浏览 5 评论 0原文

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

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

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

在身份验证器类上。

提前致谢。

once more i'm here asking help on seam subject.

Currently we have the following interceptor for audit

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

}

and the interceptor itself

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

I presume the

@In(required = false)
    Usuario usuario;

won't work because seam domain don't get into the interceptor. So how do I inject a session atribute setted on the login method as:

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

on the authenticator class.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

勿忘心安 2024-08-06 10:02:22

答案需要是:

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

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

都关闭注入

:)

The answer need was:

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

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

both off injection

:)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文