测试类加@Transactional仍报TransactionRequiredException无法执行更新删除查询
问题根因
你遇到的问题核心是测试类配置异常+可能的注解导包错误,导致测试类上的@Transactional没有生效,而@Modifying标注的更新/删除类方法强制要求运行在事务环境中,所以抛出对应异常。
其中测试类上多余的@SpringBootApplication是最常见的诱因:该注解是项目主启动类专用,加在测试类上会让测试上下文优先使用测试类作为配置源,大概率不会加载主项目的事务自动配置,最终导致@Transactional注解失效。
具体修复方案
1. 清理测试类冗余注解
删除测试类上的@SpringBootApplication注解,调整后的测试类结构如下:
// 注意导包是org.springframework.transaction.annotation.Transactional import org.springframework.transaction.annotation.Transactional; import org.springframework.boot.test.context.SpringBootTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @Transactional @SpringBootTest public class RepoTest { private final ExampleRepo repository; @Autowired public RepoTest(final ExampleRepo repository){ this.repository = repository; } @Test void testExample() { repository.exampleQuery("example", 1); } }
2. 确认@Transactional的导包正确性
必须导入Spring框架提供的org.springframework.transaction.annotation.Transactional,如果误导入了javax.transaction.Transactional,Spring的事务管理器不会识别该注解,自然不会开启事务。
3. 多事务管理器场景适配
如果你的项目配置了多个事务管理器,可以在@Transactional注解上指定要使用的事务管理器名称:
@Transactional(transactionManager = "jpaTransactionManager")
4. 无侵入兼容方案
如果不想修改测试类原有结构,也可以在测试包下单独自定义Repository子接口,给对应方法补充@Transactional注解,完全不会影响主代码库:
// 仅存放在测试代码包下 public interface TestExampleRepo extends ExampleRepo { @Override @Transactional int exampleQuery(String example, int id); }
测试时直接注入TestExampleRepo即可正常调用。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

