gpt4 book ai didi

java - Spring Data Rest - 当 @HandleBeforeSave 中发生运行时异常时事务未回滚?

转载 作者:行者123 更新时间:2023-11-30 05:59:02 24 4
gpt4 key购买 nike

我正在将 Spring Data REST 与 Spring Boot 1.5.16 结合使用,我的项目具有以下实体。

Atoll.class

@Data
@Entity
public class Atoll {

@Id
@GeneratedValue
private long id;

private String atollName;

}

ErrorLog.class

@Data
@Entity
public class ErrorLog {


@Id
@GeneratedValue
private long id;

private String errorMessage;

public ErrorLog() {

}

public ErrorLog(String errorMessage) {
this.errorMessage = errorMessage;
}
}

我还有以下 Atoll 类的 RepositoryEventHandler。出于问题的目的,我只是在这里抛出一个异常。

@Component
@RepositoryEventHandler
public class AtollHandler {

@HandleBeforeSave
public void handleBeforeSave(Atoll atoll){

if(true){
throw new ResourceNotFoundException("A");
}

}
}

当我向atolls/1发送PATCH请求时,会记录运行时异常,但环礁实体仍然会更新。那么我做错了什么?

我发现了一些类似的问题,例如 this one但它没有正确解释为什么会发生这种情况

注意:我还有一个 Rest 异常处理程序类,它将错误日志写入数据库。当我注释掉代码的错误日志编写部分时,当发生运行时异常时,环礁实体不会更新

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

@Autowired
ErrorLogRepository errorLogRepository;

@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<?> handleResourceNotFoundException(ResourceNotFoundException rnfe, HttpServletRequest request) {

ErrorLog errorLog = new ErrorLog(rnfe.getMessage());
errorLogRepository.save(new ErrorLog(rnfe.getMessage()));
return new ResponseEntity<>(errorLog, null, HttpStatus.NOT_FOUND);
}


}

最佳答案

我终于明白了这一点。默认情况下,spring @Transactional 只捕获未经检查的异常。由于处理程序抛出 ResourceNotFoundException,它是一个已检查的异常,因此事务不会回滚。所以AtollHandler类需要添加@Transactional(rollbackFor = Exception.class)注解。

关于java - Spring Data Rest - 当 @HandleBeforeSave 中发生运行时异常时事务未回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com