我开发了一个注册功能。将在数据库中创建一个新的用户帐户,然后将发送一封欢迎电子邮件。电子邮件发送功能可以执行异常。如果抛出异常,则必须删除创建的用户帐户。问题是我的无状态 bean 只有在抛出未经检查的异常时才会回滚。我的异常是检查异常。要么我必须包含一个未经检查的异常,然后我不能用正确的 http 状态代码(使用 jax rs)进行响应,要么我必须执行手动回滚。
有人可以为我的场景提供帮助并提供更好的解决方案吗?
谢谢!
最佳答案
您可以使用 annotation 注释已检查的异常: @ApplicationException(rollback = true).
例如:
@ApplicationException(rollback = true)
public class MyApplicationException extends Exception{
}
这会将当前事务标记为回滚。
编辑:
I do not want to use a exception to execute a rollback because I cant response with a http status code
另一种选择是使用 SessionContext.setRollbackOnly() 显式标记要回滚的事务。方法。我不知道您的应用设计,但示例如下:
@Stateless
public class MyBean(){
@Resource
private SessionContext ctx;
public void doSomething() {
try {
//code that sends a mail
} catch (Exception e) {
ctx.setRollbackOnly(); //the transaction will not commit
//log exception
}
}
}
关于java - 在无状态 EJB 中的 JTA 环境中执行手动回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22516524/