我正在将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请求时,会记录运行时异常,但是Atoll实体仍会更新。那我在做什么错了?
我发现了一些类似的问题,例如this one,但是对于发生这种情况的原因并没有适当的解释
注意:我还有一个Rest Exception处理程序类,该类将错误日志写入数据库。当我注释掉错误日志的部分代码写入时,发生运行时异常时,环礁实体不会得到更新
@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);
}
}
答案 0 :(得分:1)
我终于想通了。默认情况下,spring @Transactional仅捕获未检查的异常。由于处理程序将抛出ResourceNotFoundException,因此它是一个已检查的异常,因此事务不会回滚。所以
@Transactional(rollbackFor = Exception.class)
注释需要添加到AtollHandler类中。