在运行测试时出错:当前线程没有可用的实际事务对应的EntityManager,无法可靠地处理 'persist' 调用
嗨,我正在尝试解决一个问题:在运行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);
}
}
在运行测试时出现此错误,但在运行应用程序时没有错误。
解决方案
方案
要解决此问题,您需要在 Controller 或 Service 层中的方法上添加 @Transactional(优先在服务层实现)。
在这个测试中,您正在调用 /api/auth/login 端点,在该端点的方法中使用了一个EntityManager,它调用了 persist 方法。
因此,与该URL映射的方法应使用 @Transactional 注解。
原因
当您在使用JPA/Hibernate时,EntityManager 与 PersistenceContext 会相互作用,我们有两种类型的 PersistenceContext:
- TRANSACTION:默认且线程安全。
- EXTENDED:不是默认且不线程安全。
在本例中,您使用的是TRANSACTION类型,这意味着需要事务才能将数据写入数据库。通过添加 @Transactional 注解,事务将被创建。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。