【问题标题】:How to handle exception with Spring/JPA?如何使用 Spring/JPA 处理异常?
【发布时间】:2017-04-14 12:10:29
【问题描述】:

我想处理这个异常:

try {
      save = usersRepository.save(user);
}
catch (Exception gottaCatchEmAll){
      System.out.println("got it");
}

在我看到的日志中:

无法添加或更新子行:外键约束失败

我怎样才能抓住它?

【问题讨论】:

    标签: spring hibernate jpa exception spring-data-jpa


    【解决方案1】:

    我建议编写建议处理程序类来处理任何异常。例如,我假设您的异常类型为DataIntegrityViolationException。这将被包裹在某种 DTO 中,可以返回到前端或用它做你喜欢的事情。

    @ControllerAdvice
    public class ExceptionHandler {
    
      @ExceptionHandler(DataIntegrityViolationException.class)
      @ResponseStatus(HttpStatus.BAD_REQUEST)
      @ResponseBody
      public ErrorDto processConstraintError(DataIntegrityViolationException ex) {
        return new ErrorDto(ex.getMessage());
      }
    
    }
    

    无需尝试从 JPA 中捕获任何内容。

    【讨论】:

    • 我将它添加到我的项目中没有任何反应,如何为特定控制器激活它?
    • 它不依赖于特定的控制器,除非您在通知注释上指定 basePackages。不过,您需要显示您的 Spring 配置在哪里扫描这个包。
    • 在启动时我在日志中看到:寻找 ControllerAdvice: : 在 ExceptionHandler 中检测到 ExceptionHandler 方法,我使用 spring boot + spring security,我没有任何额外的配置只有 spring.jpa.show-sql=true
    • 对于 Spring Boot,它应该按原样工作。只要确保您使用了您需要处理的适当异常:) 我的示例只是一个假设,可能是错误的。
    • 我做了很多测试。我尝试处理 java.lang.Exception。它适用于所有异常,但不适用于:.MySQLIntegrityConstraintViolationException:无法添加或更新子行:,知道如何修复它吗?
    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2015-05-28
    • 2023-02-10
    • 2020-01-19
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多