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<String, String> 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<Map<String, String>> handleConstraintViolation(ConstraintViolationException e) {
|
Map<String, String> 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);
|
}
|
}
|