当前位置: 首页 > 知识库问答 >
问题:

在带有@Transactional的方法注释内未捕捉到异常

常海
2023-03-14

在spring boot annotate中使用@Transactional从控制器调用update(),此update()调用update2()。所以,当我尝试使用update2()将重复值保存到数据库中时,它不会向update()抛出异常,而是转到控制器方法。我想在update()中处理异常。

@Transactional(rollbackFor = Exception.class)
    public String update()
    {
        try 
        {
            return update2();
        }
        catch (Exception e) {
            return "Exception in update()";
        }
    }


    public String update2() throws Exception
    {

        List<Employee> l = repo.findAll();
            for(int i=0 ; i<2 ; i++)
            {
                if(i==0)
                    l.get(i).setUsername("duplicate_value");
                else
                    l.get(i).setUsername("unique_value");
            repo.save(l.get(i));
            }

        return "success";
    }

共有1个答案

蒙麒
2023-03-14

正如Hadi Moloodi在评论中提到的,您的@Transactional注释是使您的Exception不可捕捉的原因。

您可以尝试将事务注释移动到您的update2方法,如下所示:

public String update() {
    try {
        return update2();
    } catch (Exception e) {
        return "Exception in update()";
    }
}

@Transactional(rollbackFor = Exception.class)
public String update2() throws Exception {

    List<Employee> l = repo.findAll();
        for(int i=0 ; i<2 ; i++) {
            if(i==0) {
                l.get(i).setUsername("duplicate_value");
            } else {
                l.get(i).setUsername("unique_value");
            }
            repo.save(l.get(i));
        }
        return "success";
}
 类似资料:
  • 问题内容: 美好的一天。如下代码: 据我了解,如果方法中存在异常,则不会回滚事务。以及如何使它滚动?并返回SomeResult 问题答案: 您不应该以编程方式调用回滚。根据docs的建议,最好的方法是使用声明性方法。为此,您需要注释哪些异常将触发回滚。 在你的情况下,像这样 看一下@Transaction API 和有关回滚事务的文档。 如果尽管有文档建议,但仍要进行程序化回滚,则需要按照已建议的

  • 问题内容: 我在Service类中看到了一种被标记为的方法,但是它也在同一类中调用了其他未标为的方法。 这是否意味着对单独方法的调用导致应用程序打开与DB的单独连接或暂停父事务等? 不带任何注释的方法的默认行为是什么,而另一个带有注释的方法调用该方法的默认行为是什么? 问题答案: 当你调用没有事务块之内的方法时,父事务将继续使用新方法。它将使用与父方法(with )相同的连接,以及在调用的方法中导

  • 我使用Spring AOP拦截方法执行。 我有一个界面,如下所示: 以下是接口的实现: 现在我希望任何使用@AwesomeAnnoting注释的参数的方法都应该被Spring AOP捕获。 所以我写了以下方面,这是有效的。 但是,当我尝试查找参数注释时,我没有得到任何注释。如上所述,annotationMatrix为空。 所以我的问题是: 为什么annotationMatrix为空?可能是因为参数

  • 我正在使用带有webflux的spring boot 2.4.2连接到postgres数据库。我在使用事务性代码时观察到了一个我不理解的行为。 为了展示这种行为,我创建了一个示例应用程序,试图将行添加到两个表中;表“a”和表“b”。对表“a”的插入预计将失败,并出现重复密钥冲突。考虑到使用了事务性,我希望不会向表“b”中添加任何行。 然而,根据我用哪个方法注释事务,我会得到不同的结果。 如果我对c

  • 我正在测试一个Spring重试,但似乎没有调用恢复。试图让它工作,但似乎详尽无遗。我传递给@recover no argument,Throwable,exception。改变了重试依赖的版本,似乎它包含在spring boot的aop中,并删除了它。Creading Geting Recovery没有被调用,出现以下异常Messege。 请求处理失败;嵌套异常是org.springframewo