You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的代理对象,事务拦截器无法拦截。
    解决办法二选一:

    1. 将该方法抽取到独立的@Service类中,通过依赖注入调用;
    2. 在当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:50:25