我开发了注册功能。将在数据库中创建一个新的用户帐户,之后将发送欢迎电子邮件。电子邮件发送功能可以执行一个例外。如果抛出异常,则必须删除创建的用户帐户。问题是只有在抛出未经检查的异常时,我的无状态bean才会回滚。我的例外是检查异常。要么我必须包装一个未经检查的异常,然后我不能使用正确的http状态代码(使用jax rs)进行响应,或者我必须执行手动回滚。
有人可以为我的方案提供帮助并提供更好的解决方案吗?
谢谢!
答案 0 :(得分:3)
您可以使用annotation注释已检查的异常:@ApplicationException(rollback = true)。
例如:
@ApplicationException(rollback = true)
public class MyApplicationException extends Exception{
}
这将标记当前事务以进行回滚。
修改强>
我不想使用异常来执行回滚,因为我无法使用http状态代码进行响应
其他替代方法是使用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
}
}
}