首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDI TransactionInterceptor

CDI TransactionInterceptor
EN

Stack Overflow用户
提问于 2015-11-15 14:28:36
回答 2查看 893关注 0票数 0

如何捕获拦截器CDI的返回?

我创造了这个:

代码语言:javascript
复制
@Interceptor
@Transactional
public class TransactionInterceptor implements Serializable {

    private static final long serialVersionUID = 1L;

    private @Inject EntityManager manager;

    @AroundInvoke
    public Object invoke(InvocationContext context) throws Exception {

        System.out.println("Interceptor on!");      
        EntityTransaction trx = manager.getTransaction();
        Object obj = null;
        boolean criador = false;

        try {

            if (!trx.isActive()) {

                System.out.println("Iniciando transação ...");
                trx.begin();

                criador = true;
            }

            obj = context.proceed();

            if (trx != null && trx.isActive() && criador) {

                System.out.println("Comitando ...");
                trx.commit();

            }

            System.out.println("Finalizando interceptor ...");

        } catch (Exception e) {

            System.out.println("ERRO ENCONTRADO !");
            System.out.println(e.getMessage());

            if (trx != null && trx.isActive() && criador) {
                System.out.println("Rollback ...");
                trx.rollback();
            }

            System.out.println("Finalizando interceptor ...");

            return obj;
        } 

        return obj;
    }

}

我想知道这个事务是被执行的还是被回滚的。

这是主要的方法:

代码语言:javascript
复制
@Override
@Transactional
public boolean salvar(Funcionario funcionario) {

    return funcionarioDAOImpl.salvar(funcionario);
}

我该怎么做?我不使用弹簧。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-16 14:40:32

最简单的方法是在回滚事务后从拦截器中抛出一个RuntimeException。这正是标准Java 7 @Transactional注释所做的--如果一切顺利,事务将被提交并继续正常执行,否则事务将回滚,调用代码需要捕获异常。

代码示例:

代码语言:javascript
复制
@Interceptor
@Transactional
public class TransactionInterceptor implements Serializable {

    @AroundInvoke
    public Object invoke(InvocationContext context) throws Exception {
        ...
        try {
          ...
        } catch (Exception e) {

            if (trx != null && trx.isActive() && criador) {
                trx.rollback();
                throw new RuntimeException("Transaction rolled back!", e);
            }

        } 

        return obj;
    }

}

// transactional bean
public class SalvarExecutor {
@Transactional
public boolean salvar(Funcionario funcionario) {
   return funcionarioDAOImpl.salvar(funcionario);
}
}

// caller CDI bean
public class Caller {
  @Inject SalvarExecutor executor;

  public void execute() {
    try {
      salvar.salvar();
    } catch (Exception e) {
      // salvar was rolled back by the interceptor
    }
  }
}

您可以在catch块中引入您自己的RuntimeException后代,使其更加具体。

另一个选项,尽管不是那么清晰和可读性:

可以创建一个单独的@RequestScoped bean,您可以将其注入拦截器和调用方bean。然后,拦截器可能与调用方间接通信--它可能更新中间请求作用域bean,然后调用方可以从同一个bean检索数据。

票数 0
EN

Stack Overflow用户

发布于 2015-11-15 17:13:09

不知道你想做什么。被截获的方法不知道它正在被截获,也没有“拦截器的返回(值?)”这样的东西。

在Java 7中,有一个javax.transaction.Transactional拦截器绑定,它可以开箱即用。无需为JPA事务编写自己的拦截器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33720813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档