package com.greenorange.promotion.exception; import com.greenorange.promotion.common.BaseResponse; import com.greenorange.promotion.common.ErrorCode; import com.greenorange.promotion.common.ResultUtils; import io.swagger.v3.oas.annotations.Hidden; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.util.validation.ValidationError; import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Comparator; import java.util.List; /** * 全局异常处理器 */ @Slf4j @Hidden @RestControllerAdvice public class GlobalExceptionHandler { // 处理参数类型不匹配的异常(GET请求) @ExceptionHandler(MethodArgumentTypeMismatchException.class) public BaseResponse handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException ex) { return ResultUtils.error(ErrorCode.PARAMS_ERROR, "请求参数类型不匹配: " + ex.getName()); } // 处理消息体解析失败的异常(POST请求) @ExceptionHandler(HttpMessageNotReadableException.class) public BaseResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { log.error("HttpMessageNotReadableException", e); return ResultUtils.error(ErrorCode.PARAMS_ERROR, "请求体不能为空或格式无效"); } // 处理参数绑定失败的异常 @ExceptionHandler(MethodArgumentNotValidException.class) public BaseResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { // StringBuilder errors = new StringBuilder(); // // 按字段名排序,确保每次返回的顺序一致 // e.getBindingResult().getFieldErrors().stream() // .sorted(Comparator.comparing(FieldError::getField)) // 按字段名排序 // .forEach(fieldError -> errors.append("参数: ") // .append(fieldError.getField()) // .append(" | 错误: ") // .append(fieldError.getDefaultMessage()) // .append("; ")); // return ResultUtils.error(ErrorCode.PARAMS_ERROR, errors.toString()); // 按字段名排序,取第一个错误的 defaultMessage String msg = e.getBindingResult() .getFieldErrors().stream() .sorted(Comparator.comparing(FieldError::getField)) .map(FieldError::getDefaultMessage) .findFirst() .orElse("参数校验失败"); return ResultUtils.error(ErrorCode.PARAMS_ERROR, msg); } // 处理业务异常 @ExceptionHandler(BusinessException.class) public BaseResponse businessExceptionHandler(BusinessException e) { log.error("BusinessException", e); return ResultUtils.error(e.getCode(), e.getMessage()); } // 处理 SQL 语法错误 @ExceptionHandler(SQLException.class) public BaseResponse handleSQLException(SQLException ex) { // 记录详细的 SQL 错误信息 log.error("SQL 错误: " + ex.getMessage()); return ResultUtils.error(ErrorCode.DATABASE_ERROR, "SQL语法错误,详细信息:" + ex.getMessage()); } }