Java 事务性CDIBean:如何强制事务回滚

Java 事务性CDIBean:如何强制事务回滚,java,transactions,Java,Transactions,我在REST接口中注入了@RequestScope、@Transactional CDI bean: @RequestScoped @Transactional public class myRestCall { @Inject EntityHandlerService ehs; // contains @PersistenceContext try { // execute business logic, access DB

我在REST接口中注入了@RequestScope、@Transactional CDI bean:

@RequestScoped
@Transactional
public class myRestCall
{
    @Inject
    EntityHandlerService    ehs;        // contains @PersistenceContext

    try
    {
       // execute business logic, access DB via ehs (JPA / Hibernate)
    }
    catch(Throwable t)
    {
        // log exception
        // -> rollback transaction
    }
}
现在,我喜欢对业务逻辑的调用进行一次try/catch,以便正确地记录异常。但是我需要手动回滚事务,除非我再次抛出我不喜欢的异常。那么我怎样才能在这里强制事务回滚呢?如果它是EJB,我知道怎么做:我们可以做

@Resource
private SessionContext ctx;     
然后

ctx.setRollbackOnly();
捕捉中
关闭


但是,它不是一个EJB,由于资源限制,我无法使用它来创建EJB。

您可以包含一个与@Transactional注释相关的参数rollbackOn=“Exception.class”


但是如果您这样做,您必须退出“try-catch”块

以防有人仍在寻找答案,您可以添加@Resource TransactionSynchronizationRegistry,然后调用setRollbackOnly()

如果无法使用@Resource,可以使用jndi查找trx注册表:


java:comp/TransactionSynchronizationRegistry

根据文档:-它实际上是
回滚
@Wakachopo:这是什么意思,但是如果你这样做,你必须退出“try-catch”块?如果你在方法中使用try-catch块,try块中抛出的异常将在catch块中处理,我永远不会被打倒。如果您不希望特定的异常导致回滚,这将非常有用,例如,如果捕获NullPointerException,这种异常将不会导致回滚,但任何其他类型的异常都会导致回滚。如果捕获到异常,@Transactional将不会看到异常,因为它不会抛出。@Wakachopo:我理解。但我的问题恰恰是这样的:我想要捕捉每一个可丢弃的对象,做日志记录并手动强制回滚,而不想将exeption抛出到容器中。因此,你的回答不能回答问题,也没有帮助!您可以捕获异常,记录它,然后从catch块抛出相同的异常。它将被记录,然后回滚,因为手动抛出的异常永远不会被捕获。你有没有办法实现你的目标?
@RequestScoped
class MyBean {
    @Resource
    private TransactionSynchronizationRegistry reg;

    @Transactional
    void yourmethod()
    {
        try {
             // do stuff

        } catch (Exception e) {
             reg.setRollbackOnly();       
        }

    }
}