Java 事务性CDIBean:如何强制事务回滚
我在REST接口中注入了@RequestScope、@Transactional CDI bean: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
@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();
}
}
}