From 4b39373c6de75f1b5f1114a2ec32a9e2280d665e Mon Sep 17 00:00:00 2001 From: theo <971366405@qq.com> Date: Fri, 19 Sep 2025 14:58:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(exception):=20=E5=A2=9E=E5=8A=A0=20SQL=20?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E6=80=A7=E7=BA=A6=E6=9D=9F=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86-=20=E6=96=B0=E5=A2=9E=20SQLIntegrityConstrai?= =?UTF-8?q?ntViolationException=20=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20-=20=E6=B7=BB=E5=8A=A0=E7=9B=B8=E5=BA=94?= =?UTF-8?q?=E7=9A=84=E9=94=99=E8=AF=AF=E7=A0=81=E5=92=8C=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E4=BF=A1=E6=81=AF-=20=E4=BC=98=E5=8C=96=20SQLSyntaxErrorExcept?= =?UTF-8?q?ion=20=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E9=94=99=E8=AF=AF=E7=A0=81=E4=BB=A3=E6=9B=BF=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E8=BF=94=E5=9B=9E=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/GlobalExceptionHandler.java | 23 +++++++++++++++---- .../youlai/boot/common/result/ResultCode.java | 2 ++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/youlai/boot/common/exception/GlobalExceptionHandler.java b/src/main/java/com/youlai/boot/common/exception/GlobalExceptionHandler.java index 519c1ca9..434921a2 100644 --- a/src/main/java/com/youlai/boot/common/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/youlai/boot/common/exception/GlobalExceptionHandler.java @@ -4,6 +4,9 @@ import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.youlai.boot.common.result.Result; import com.youlai.boot.common.result.ResultCode; +import jakarta.servlet.ServletException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.TypeMismatchException; import org.springframework.context.support.DefaultMessageSourceResolvable; @@ -21,10 +24,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.servlet.NoHandlerFoundException; -import jakarta.servlet.ServletException; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.ConstraintViolationException; - +import java.sql.SQLIntegrityConstraintViolationException; import java.sql.SQLSyntaxErrorException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -207,7 +207,20 @@ public class GlobalExceptionHandler { @ResponseStatus(HttpStatus.FORBIDDEN) public Result processSQLSyntaxErrorException(SQLSyntaxErrorException e) { log.error(e.getMessage(), e); - return Result.failed(e.getMessage()); + return Result.failed(ResultCode.DATABASE_EXECUTION_SYNTAX_ERROR); + } + + + /** + * 处理 SQL 违反了完整性约束 + *

+ * 当 SQL 违反了完整性约束时,会抛出 SQLIntegrityConstraintViolationException 异常。 + */ + @ExceptionHandler(SQLIntegrityConstraintViolationException.class) + @ResponseStatus(HttpStatus.FORBIDDEN) + public Result handleSQLIntegrityConstraintViolationException(SQLIntegrityConstraintViolationException e) { + log.error(e.getMessage(), e); + return Result.failed(ResultCode.INTEGRITY_CONSTRAINT_VIOLATION); } /** diff --git a/src/main/java/com/youlai/boot/common/result/ResultCode.java b/src/main/java/com/youlai/boot/common/result/ResultCode.java index e55042da..2876e6c1 100644 --- a/src/main/java/com/youlai/boot/common/result/ResultCode.java +++ b/src/main/java/com/youlai/boot/common/result/ResultCode.java @@ -243,12 +243,14 @@ public enum ResultCode implements IResultCode, Serializable { TABLE_NOT_EXIST("C0311", "表不存在"), COLUMN_NOT_EXIST("C0312", "列不存在"), + DATABASE_EXECUTION_SYNTAX_ERROR("C0313", "数据库执行语法错误"), MULTIPLE_SAME_NAME_COLUMNS_IN_MULTI_TABLE_ASSOCIATION("C0321", "多表关联中存在多个相同名称的列"), DATABASE_DEADLOCK("C0331", "数据库死锁"), PRIMARY_KEY_CONFLICT("C0341", "主键冲突"), + INTEGRITY_CONSTRAINT_VIOLATION("C0342", "违反了完整性约束"), DATABASE_ACCESS_DENIED("C0351", "演示环境已禁用数据库写入功能,请本地部署修改数据库链接或开启Mock模式进行体验"),