Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CDI交易接收器_Java_Hibernate_Jpa_Cdi - Fatal编程技术网

Java CDI交易接收器

Java CDI交易接收器,java,hibernate,jpa,cdi,Java,Hibernate,Jpa,Cdi,如何捕获拦截器CDI的返回 我创建了以下内容: @Interceptor @Transactional public class TransactionInterceptor implements Serializable { private static final long serialVersionUID = 1L; private @Inject EntityManager manager; @AroundInvoke public Object i

如何捕获拦截器CDI的返回

我创建了以下内容:

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

}
我想知道交易是被提交还是被回滚

这是主要的方法:

@Override
@Transactional
public boolean salvar(Funcionario funcionario) {

    return funcionarioDAOImpl.salvar(funcionario);
}

我该怎么做?我不使用spring。

不确定您想做什么。被拦截的方法不知道它正在被拦截,并且不存在“拦截器的返回(值?)这样的事情”


在JavaEE7中,有一个现成的
javax.transaction.Transactional
拦截器绑定。无需为JPA事务编写自己的拦截器。

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

代码示例:

@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中检索数据。

我想知道传输是得到了提交还是回滚。