Service类中@Transactional方法未被TransactionInterceptor拦截的解决方法
解决@Service类中@Transactional方法不被TransactionInterceptor拦截的问题
修改方法访问修饰符为public
Spring的事务拦截器默认仅对public方法生效,你的方法使用protected修饰,这是核心原因之一。修改代码如下:@Transactional public HttpHeaders _updateRefreshTokenAndGetHeader(String refreshToken, String accessToken, String newAccessToken) throws Exception { // 原有逻辑保持不变 }避免内部方法调用(如果存在)
如果该方法是被当前Service类的其他方法直接调用(比如this._updateRefreshTokenAndGetHeader(...)),即使改成public也不会生效——因为内部调用跳过了Spring的代理对象,事务拦截器无法拦截。
解决办法二选一:- 将该方法抽取到独立的@Service类中,通过依赖注入调用;
- 在当前Service中注入自身的代理对象,通过代理对象调用该方法:
@Service public class TokenProvider implements InitializingBean { // 注入自身代理对象 @Autowired private TokenProvider selfProxy; // 其他代码... // 调用时使用代理对象 public void someBusinessMethod() throws Exception { selfProxy._updateRefreshTokenAndGetHeader(refreshToken, accessToken, newAccessToken); } }
验证全局事务配置
虽然Controller中的事务生效说明配置基本没问题,但仍需确认:- 项目启动类或配置类上是否添加了
@EnableTransactionManagement注解; - 数据源和事务管理器(如
DataSourceTransactionManager)是否正确配置并被Spring容器管理。
- 项目启动类或配置类上是否添加了
内容的提问来源于stack exchange,提问作者JinYeong Kim
相关产品推荐
相关产品推荐

