sobadstan 2024-12-06 21:42 采纳率: 28.6%
浏览 24

springboot异常捕获问题

SQLIntegrityConstraintViolationException报错被Exception捕获到了而不是SQLIntegrityConstraintViolationException捕获器

img

img


这是为什么捏

  • 写回答

4条回答 默认 最新

  • JavaPub-rodert 博客专家认证 2024-12-17 10:50
    关注

    本答案参考多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢。

    在Spring Boot中,SQLIntegrityConstraintViolationException异常通常被Spring框架包装成了DataIntegrityViolationException,这就是为什么您无法直接捕获到SQLIntegrityConstraintViolationException异常的原因。为了处理这种情况,您需要捕获DataIntegrityViolationException异常,并在其中检查是否包含SQLIntegrityConstraintViolationException异常的消息。以下是一个代码示例:

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(DataIntegrityViolationException.class)
        public AjaxResult handleSQLIntegrityConstraintViolationException(DataIntegrityViolationException e, HttpServletRequest request) {
            String requestURI = request.getRequestURI();
            if (e.getMessage().contains("Cannot delete or update a parent row: a foreign key constraint fails")) {
                log.error("请求地址'{}',发生外键约束异常.", requestURI, e);
                return AjaxResult.error("操作失败:存在外键约束,无法删除或更新相关数据。");
            }
            //返回数据完整性约束违反
            log.error("请求地址'{}',发生数据完整性约束异常.", requestURI, e);
            return AjaxResult.error("操作失败:数据完整性约束违反。");
        }
    }
    

    在这个全局异常处理器中,我们检查异常消息是否包含特定的外键约束失败信息,并据此返回相应的错误信息。这样,即使SQLIntegrityConstraintViolationException被包装成了DataIntegrityViolationException,我们也能够正确地捕获并处理它。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月6日