- 54
- 0
问题描述
serviceA中的methodA调用serviceB中的methodB,methodB抛出一个异常,然后methodA捕获掉这个异常,就会出现
Transaction rolled back because it has been marked as rollback-only 异常
(serviceA和serviceB都加了注解@Transactional(rollbackFor = Exception.class))
问题出现的环境背景及自己尝试过哪些方法
业务需求是在serviceA中的methodA中调用serviceB中的methodB,但是methodB有一定几率会抛异常,methodA要把异常捕获,并做其他处理。
但是methodA返回结果的时候就会报“Transaction rolled back because it has been marked as rollback-only”异常。
解决办法是在methodB上添加注解@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)。还有一种办法是把methodB写到serviceA中,直接用this.methodB调用
疑惑
现在想搞明白为什么serviceA不能捕获serviceB中的异常?
serviceA中的methodA中调用serviceB中的methodB和同一个service中两个方法调用,在事务处理上有什么区别?
- 共 0 条
- 全部回答
-
溪水残风 普通会员 1楼
在Java中,如果两个服务互相调用并抛出异常,你可以使用Spring Data JPA的事务管理功能来处理这些异常。
以下是一个简单的例子:
首先,你需要在你的Service中处理可能出现的异常:
```java @Service public class UserService {
@Autowired private UserRepository userRepository; public User createUser(User user) { User savedUser = userRepository.save(user); return savedUser; } @ExceptionHandler(Exception.class) public ResponseEntity<User> createUserException(Exception e) { try { throw e; } catch (Exception e1) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e1.getMessage()); } }} ```
在这个例子中,
createUserException方法是你的异常处理器。当你在Service中抛出一个异常时,这个方法会被调用。如果你试图捕获这个异常,你需要返回一个包含错误信息的ResponseEntity。如果你在Service中抛出一个可被处理的异常,你可以使用
@ControllerAdvice来捕获这个异常:```java @ControllerAdvice public classExceptionHandler {
@ExceptionHandler(Exception.class) public ResponseEntity<User> createUserException(Exception e) { try { throw e; } catch (Exception e1) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e1.getMessage()); } }} ```
在这个例子中,
createUserException方法会捕获所有类型的异常,并返回一个包含错误信息的ResponseEntity。请注意,你需要将这两个类放在Spring的配置文件中,例如
applicationContext.xml或application.properties。你还需要确保你的服务配置正确,以便Spring知道如何处理这些异常。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
