| | |
| | | package com.ycl.jxkg.config.spring.exception; |
| | | |
| | | import com.fasterxml.jackson.core.JsonProcessingException; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.ycl.jxkg.base.Result; |
| | | import com.ycl.jxkg.base.SystemCode; |
| | | import com.ycl.jxkg.utils.ErrorUtil; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.http.HttpStatus; |
| | | import org.springframework.validation.BindException; |
| | | import org.springframework.validation.FieldError; |
| | | import org.springframework.web.HttpRequestMethodNotSupportedException; |
| | | import org.springframework.web.bind.MethodArgumentNotValidException; |
| | | import org.springframework.web.bind.annotation.ControllerAdvice; |
| | | import org.springframework.web.bind.annotation.ExceptionHandler; |
| | | import org.springframework.web.bind.annotation.ResponseBody; |
| | | import org.springframework.web.bind.annotation.RestControllerAdvice; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司 |
| | | * @date 2021/12/25 9:45 |
| | | */ |
| | | @ControllerAdvice |
| | | @RestControllerAdvice |
| | | public class ExceptionHandle { |
| | | |
| | | private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class); |
| | | /** |
| | | * 公司项目的包结构,用于缩短错误日志的长度 |
| | | */ |
| | | private final static String COMPANY_PACKAGE = "com.ycl.jxkg."; |
| | | |
| | | /** |
| | | * Handler rest response. |
| | |
| | | */ |
| | | @ExceptionHandler(Exception.class) |
| | | @ResponseBody |
| | | public Result handler(Exception e) { |
| | | logger.error(e.getMessage(), e); |
| | | public Result handler(Exception e, HttpServletRequest request) { |
| | | String errMsg = String.format("系统异常-%s", e.getMessage()); |
| | | this.printExceptionLocation(e, request, errMsg); |
| | | return new Result<>(SystemCode.InnerError.getCode(), SystemCode.InnerError.getMessage()); |
| | | } |
| | | |
| | |
| | | * @param e the e |
| | | * @return the rest response |
| | | */ |
| | | @ExceptionHandler(MethodArgumentNotValidException.class) |
| | | @ExceptionHandler(RuntimeException.class) |
| | | @ResponseBody |
| | | public Result handler(MethodArgumentNotValidException e) { |
| | | String errorMsg = e.getBindingResult().getAllErrors().stream().map(file -> { |
| | | FieldError fieldError = (FieldError) file; |
| | | return ErrorUtil.parameterErrorFormat(fieldError.getField(), fieldError.getDefaultMessage()); |
| | | }).collect(Collectors.joining()); |
| | | return new Result<>(SystemCode.ParameterValidError.getCode(), errorMsg); |
| | | public Result handler(RuntimeException e, HttpServletRequest request) { |
| | | String errMsg = String.format("系统异常-%s", e.getMessage()); |
| | | this.printExceptionLocation(e, request, errMsg); |
| | | return new Result<>(SystemCode.InnerError.getCode(), e.getMessage()); |
| | | } |
| | | |
| | | /** |
| | | * JSON传参数据校验异常 |
| | | * |
| | | * @param e |
| | | * @param request |
| | | * @return |
| | | * @throws JsonProcessingException |
| | | */ |
| | | @ExceptionHandler(MethodArgumentNotValidException.class) |
| | | public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e, |
| | | HttpServletRequest request) throws JsonProcessingException { |
| | | List<String> err = e.getBindingResult().getAllErrors().stream().map(error -> error.getDefaultMessage()).collect(Collectors.toList()); |
| | | String s = new ObjectMapper().writeValueAsString(err); |
| | | String errMsg = String.format("参数校验失败-%s", s); |
| | | this.printExceptionLocation(e, request, errMsg); |
| | | return Result.fail(HttpStatus.INTERNAL_SERVER_ERROR.value(), s); |
| | | } |
| | | |
| | | /** |
| | |
| | | return new Result<>(SystemCode.ParameterValidError.getCode(), errorMsg); |
| | | } |
| | | |
| | | /** |
| | | * 请求方式不支持异常 |
| | | * |
| | | * @param e |
| | | * @param request |
| | | * @return |
| | | */ |
| | | @ExceptionHandler(HttpRequestMethodNotSupportedException.class) |
| | | public Result handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, |
| | | HttpServletRequest request) { |
| | | String errMSg = String.format("不支持%s请求", e.getMethod()); |
| | | this.printExceptionLocation(e, request, errMSg); |
| | | return Result.fail(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage()); |
| | | } |
| | | |
| | | /** |
| | | * 打印异常出现位置 |
| | | * |
| | | * @param e |
| | | */ |
| | | private void printExceptionLocation(Throwable e, HttpServletRequest request, String errMsg) { |
| | | StackTraceElement stackTraceElement = e.getStackTrace()[0]; |
| | | String className = stackTraceElement.getClassName().contains(COMPANY_PACKAGE) ? |
| | | stackTraceElement.getClassName().split(COMPANY_PACKAGE)[1] : stackTraceElement.getClassName(); |
| | | logger.error("接口:【{}】, 异常类:【{}】,方法:【{}】,所在行:【{}】, 错误信息:【{}】", |
| | | request.getRequestURI(), |
| | | className, |
| | | stackTraceElement.getMethodName(), |
| | | stackTraceElement.getLineNumber(), |
| | | errMsg); |
| | | } |
| | | } |