我在我的REST界面中注入了@RequestScoped,@ Transactal 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
}
}
现在我喜欢尝试/捕获业务逻辑的调用,我可以正确地记录异常。但我需要手动回滚事务,除非我再次抛出异常我不喜欢的事情。那么如何在这里强制执行transasction回滚呢?我知道怎么做,如果它是EJB:我们可以做到
@Resource
private SessionContext ctx;
然后
ctx.setRollbackOnly();
在catch
关闭。
但是,不是一个EJB,由于资源限制,我无法使用EJB。
答案 0 :(得分:0)
您可以包含参数rollbackOn =" Exception.class"与@Transactional注释相关联。
但如果你这样做,你必须退出" try-catch"块
答案 1 :(得分:0)
如果有人仍在寻找答案,则可以添加@Resource TransactionSynchronizationRegistry,然后调用setRollbackOnly();
@RequestScoped
class MyBean {
@Resource
private TransactionSynchronizationRegistry reg;
@Transactional
void yourmethod()
{
try {
// do stuff
} catch (Exception e) {
reg.setRollbackOnly();
}
}
}
如果您不能使用@Resource,则可以使用jndi查找trx的地址:
java:comp / TransactionSynchronizationRegistry