使用 @controlleradvice 配合 @exceptionhandler 捕获特定异常类。针对 id 冲突,通常由数据库唯一约束触发,需根据使用的持久层框架(如 jpa 或 mybatis)配置对应的异常处理器,将底层 sql 异常转换为业务逻辑异常或直接返回错误信息。

JPA 环境下如何捕获 ConstraintViolationException
在 Spring Boot 集成 JPA 时,ID 冲突会抛出 ConstraintViolationException。通过定义全局异常处理类并指定该异常类型,可以拦截此错误。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import jakarta.persistence.ConstraintViolationException;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<string> handleConstraintViolation(ConstraintViolationException ex) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("ID conflict detected");
}
}</string>
上述代码中,handleConstraintViolation 方法专门处理 ConstraintViolationException。当发生主键或唯一索引冲突时,Spring 会自动调用此方法,返回 HTTP 409 Conflict 状态码及自定义消息。
MyBatis 环境下如何捕获 DuplicateKeyException
若项目使用 MyBatis 或 MyBatis-Plus,ID 冲突通常表现为 DuplicateKeyException。需在异常处理类中针对此异常编写处理方法。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.mybatis.spring.MyBatisSystemException;
import org.apache.ibatis.exceptions.DuplicateKeyException;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(DuplicateKeyException.class)
public ResponseEntity<string> handleDuplicateKey(DuplicateKeyException ex) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Duplicate key error");
}
}</string>
在此场景中,handleDuplicateKey 方法捕获 DuplicateKeyException。与 JPA 不同,MyBatis 直接抛出此异常,无需经过 JPA 的转换层。开发者可根据实际业务需求调整返回的状态码和消息内容。
如何处理未预期的数据完整性异常
除了特定的 ID 冲突异常,数据库中可能还存在其他类型的唯一约束违反情况。为了程序的健壮性,建议增加一个通用的异常处理器来捕获所有未预期的数据完整性问题。
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.dao.DataIntegrityViolationException;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity<string> handleDataIntegrity(DataIntegrityViolationException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Data integrity violation");
}
}</string>
DataIntegrityViolationException 是 Spring 对各类数据完整性异常的通用包装。在处理完特定的 ID 冲突后,保留此通用处理器可以确保其他类似错误也能被妥善管理,避免程序崩溃。











