package com.linghu.config; import com.linghu.model.common.ResponseResult; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.HashMap; import java.util.Map; import java.util.Set; // 全局异常处理器,作用于所有 @RestController 注解的控制器 @RestControllerAdvice public class GlobalExceptionHandler { // 处理 @RequestBody 参数校验失败的异常(如 DTO 中的校验) @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseResult handleMethodArgumentNotValid(MethodArgumentNotValidException e) { Map errors = new HashMap<>(); // 获取所有校验失败的字段和消息 BindingResult bindingResult = e.getBindingResult(); for (FieldError fieldError : e.getBindingResult().getFieldErrors()) { // 字段名 -> 错误消息(如 "keyword: 关键词不能为空") errors.put(fieldError.getField(), fieldError.getDefaultMessage()); } // 返回自定义的错误响应(根据你的 ResponseResult 结构调整) return ResponseResult.error("参数校验失败"+ errors); } // 处理 @RequestParam/@PathVariable 参数校验失败的异常 @ExceptionHandler(ConstraintViolationException.class) public ResponseResult> handleConstraintViolation(ConstraintViolationException e) { Map errors = new HashMap<>(); for (ConstraintViolation violation : e.getConstraintViolations()) { String field = violation.getPropertyPath().toString(); String simplifiedField = field.substring(field.lastIndexOf('.') + 1); errors.put(simplifiedField, violation.getMessage()); } return ResponseResult.error("参数校验失败"+ errors); } }