package org.example.handler;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.example.CommonResult;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import static org.example.GlobalErrorCodeConstants.BAD_REQUEST;
@RestControllerAdvice
@AllArgsConstructor
@Slf4j
public class GlobalExceptionHandler {
/**
* 处理 SpringMVC get请求参数类型错误
* 例如说,接口上设置了 @RequestParam("xx") 参数为 Integer,结果传递 xx 参数类型为 String
*/
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public CommonResult> methodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException ex) {
log.warn("[missingServletRequestParameterExceptionHandler]", ex);
return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", ex.getMessage()));
}
/**
* 处理 SpringMVC post请求参数类型错误
* 例如说,接口上设置了 @@RequestBody 参数为 Integer,结果传递 xx 参数类型为 String
*/
@ExceptionHandler(HttpMessageNotReadableException.class)
public CommonResult> httpMessageNotReadableExceptionHandler(HttpMessageNotReadableException ex) {
log.warn("[missingServletRequestParameterExceptionHandler]", ex);
return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", ex.getMessage()));
}
/**
* 处理 SpringMVC get请求参数类型错误
* 例如说,接口上设置乐对象类型接收参数 参数为 Integer,结果传递 xx 参数类型为 String
*/
@ExceptionHandler(BindException.class)
public CommonResult> bindExceptionHandler(BindException ex) {
log.warn("[handleBindException]", ex);
FieldError fieldError = ex.getFieldError();
// 断言,避免告警
assert fieldError != null;
return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数:%s类型不正确:%s",fieldError.getField(), fieldError.getDefaultMessage()));
}
}