java - 在无状态 EJB 中的 JTA 环境中执行手动回滚

标签 java jpa ejb jta

我开发了一个注册功能。将在数据库中创建一个新的用户帐户,然后将发送一封欢迎电子邮件。电子邮件发送功能可以执行异常。如果抛出异常,则必须删除创建的用户帐户。问题是我的无状态 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/

相关文章:

java - 打开新浏览器选项卡时的 SessionAttributes

java - 从另一个类访问的静态 ArrayList 始终为空

java - 将 Scala 单位转换为 Java Void

java - "Hibernate"类映射到底代表什么?

java - @EJBs 注解有什么作用?

java - 如何避免关闭传递给我包装在 Reader 流中的方法的 InputStream?

java - hibernate3 maven 插件 :make hbm2java generate hibernate annotations instead of ejb3 annotations

java - JPA 实体 bean 是否可以包含将对象添加到 Collection 字段的方法?

java - 如何远程访问@Stateless @LocalBean

java - EJB 命名查询首选项