【发布时间】:2015-09-20 02:33:50
【问题描述】:
我的 Spring 应用程序被分层为 Bean、Service 和 DAO。所有的@Transactional 注解都在服务层。
这是一个特定场景中的伪代码。
UserBean.java
saveUser() {
userService.manageUser();
}
UserServiceImpl.java
@Transactional
public void manageUser() {
userDAO.createUser();
userDAO.updateParentUser();
}
UserDAOImpl.java
createUser() {
//insert user record in database
}
updateParentUser() {
//update parent user's database record
}
在我的保存用户测试用例中,更新父用户操作在某些情况下可能会由于主键违规而失败,这是意料之中的。
由于@Transactional注解是在service类中实现的,这个违规异常只会在bean类中通知。
在我的服务类中获取此 PK 违规通知的选项是什么? [然后我可以从那里在不同的业务流程中处理它。]
如果我在服务类中添加一个新方法并从那里调用 manageUser(),@Transactional 注释将无法正常工作。这是由于limitation/property of AOP。 Spring 期望外部调用 @Transactional 方法。
【问题讨论】:
-
你说“这个违反异常只会在bean类中通知”是什么意思。当然如果异常是在服务类中抛出的,那么你也可以在服务类中捕获并妥善处理?
-
@ConMan 当@Transactional 方法“退出”时会发生此异常。因此,使用当前代码,我将无法在服务类中捕获它。
标签: spring jakarta-ee spring-transactions transactional