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

Spring JPA服务-验证-运行时异常

吉凯捷
2023-03-14

我有一个API,如下所示

@Transaction
void method (){
try{
  service1.insertOne();
  service2.insertTwo();
}
catch(Exception ex) {
// log exception
}
}

在服务类中,我检查某些验证,并抛出一个异常,该异常是<code>RuntimeException<code>的子类。当我抛出这个异常时,javax.persistence。RollbackException:标记为rollbackOnly的事务。虽然它阻止第一个服务中的数据不被插入,但由于第二个服务验证失败,我不太确定这是否是处理此场景的正确方法。

如果异常不是< code>Exception的子类,即使service2的验证失败,service1中的数据也会被插入,但我确实看到了自定义异常被抛出。所以我不确定我错在哪里。感谢任何帮助。

共有3个答案

凌蕴藉
2023-03-14

只需使用@TransactionalnoRollbackFor选项来指定哪个异常不应触发回滚:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html#noRollbackFor --

@Transaction (noRollbackFor=YourRuntimeException.class)
void method (){
    try{
      service1.insertOne();
      service2.insertTwo();
    }
    catch(Exception ex) {
    // log exception
    }
}
申屠健
2023-03-14

如果您的插入一个插入两个方法标记为@Transactional,则默认传播为必需。所以您应该会看到在一个事务中执行的所有内容。链接到文档

在第二种情况下,它也应该正常工作。如果你抛出自定义事务,那么Spring不会处理它。您可以通过提供< code>rollbackFor来更新默认行为。在这种情况下,你会看到与第一种情况几乎相同的情况。

因此,对您来说,这是一个更大的问题 - 您是否希望您的验证将事务标记为仅回滚,或者不这样做。我会说是的。

也许问题太抽象了。假设您正在输入发票和头寸——那么我希望此交易会回滚。但是,如果您添加组,用户......组可以走了,因为问题是用户。

桓喜
2023-03-14

Spring框架的事务基础设施代码只在运行时、未检查异常的情况下标记回滚的事务;也就是说,当抛出的异常是RuntimeException的实例或子类时。

https://docs . spring . io/spring/docs/current/spring-framework-reference/data-access . html # transaction-declarative-rolling-back

因此,它必须保持为<code>RuntimeException

可能你在 service1.insertOne 和/或 service2.insertTwo() 方法之上有事务性注释,这就是为什么你得到 javax.persistence.RollbackException: Transaction 标记为 rollbackOnly

您不需要这些额外的注释(如果存在的话),因为已经有一个活动事务。

看看这个答案。

 类似资料:
  • 我被难倒了....对于获得向缺少什么,有什么想法吗?

  • 我使用eclipse在本地机器上编写了几个servlet。我在本地机器上测试了它们,一切都很好。 然后,我将我的项目导出为.war文件,并将其放在另一台计算机中tomcat的webapps目录下,我只有ssh访问权限。我重新启动了tomcat服务器,在查看了日志文件后,我发现它抛出了以下异常: 不知道这意味着什么?

  • 我试图了解gRPC中的异常处理机制是如何工作的。 除了try-catch块之外,还有其他方法来处理运行时异常,例如服务器端的IllegalArgumentException吗? 例如,我有一些gRPC流式客户端服务,当传递的参数不满足深层次的一些断言时(在某些库中,例如,com.google.common.base.Preconditions),方法onNext抛出IllegalArgumentE

  • 问题内容: 我的意图是读取原始资源,然后使用JSON将其转换为Java代码。执行此操作的类和外部库存储在另一个项目中。当我运行我的应用程序时,在日志猫中出现此错误: 我可以说该错误是由JSONArray的创建引起的。我已经在stackoverflow上遇到过此错误,但是没有明确的方法来解决此问题。任何人都可以向我推荐解决此问题的方法。帮助将不胜感激。 问题答案: 您正在添加似乎具有未解决依赖性的n

  • 我正在为Spring引导Web服务器编写集成测试 我想使用junit-jupiter(junit5)来检查服务器是否正在使用运行,以便在服务器未运行时测试不会失败... 似乎没有任何API支持这样的操作,但是可以通过其他方式实现吗?Ping 服务器?

  • 我从minecraft技术页面为1.12.2包下载了服务器文件夹,在运行LaunchServer.bat时,我得到以下错误: 我的输出: 对于环境变量: 我的设置为 我的路径包含 我尝试的内容:我查看了.bat文件,并将其更改为Minecraft.NET推荐的行。我还有一个对运行服务器有经验的朋友看了一下,他说批处理文件的文件和行看起来很好。所以我想这是我的java和如何安装它的一个问题。在做了一