在运行测试时出错:当前线程没有可用的实际事务对应的EntityManager,无法可靠地处理 'persist' 调用

后端开发 2026-07-11

嗨,我正在尝试解决一个问题:在运行Controller测试AuthControllerIntegrationTest时,出现以下错误:

原因:jakarta.persistence.TransactionRequiredException:当前线程没有可用的实际事务的EntityManager - 无法可靠地处理 'persist' 调用

测试类:

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@DisplayName("Saving Endpoints Integration Tests")
@Transactional
public class AuthControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    public void testLogin() throws Exception {
        getToken("admin", "azerty");
    }

    private LoginResponse getToken(final String username, final String password)
            throws JsonProcessingException, Exception {
        final LoginRequest loginRequest = new LoginRequest();
        loginRequest.setUsername(username);
        loginRequest.setPassword(password);

        final MvcResult result = mockMvc
                .perform(post("/api/auth/login").contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(loginRequest)))
                .andDo(print()).andExpect(status().isOk()).andReturn();
        return objectMapper.readValue(result.getResponse().getContentAsString(), LoginResponse.class);

    }
}

在运行测试时出现此错误,但在运行应用程序时没有错误。

解决方案

方案

要解决此问题,您需要在 ControllerService 层中的方法上添加 @Transactional(优先在服务层实现)。

在这个测试中,您正在调用 /api/auth/login 端点,在该端点的方法中使用了一个EntityManager,它调用了 persist 方法。

因此,与该URL映射的方法应使用 @Transactional 注解。

原因

当您在使用JPA/Hibernate时,EntityManagerPersistenceContext 会相互作用,我们有两种类型的 PersistenceContext

  1. TRANSACTION:默认且线程安全。
  2. EXTENDED:不是默认且不线程安全。

在本例中,您使用的是TRANSACTION类型,这意味着需要事务才能将数据写入数据库。通过添加 @Transactional 注解,事务将被创建。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章