luohairen
2024-11-14 247cb86585a1d1894596ed18a6c93efecb992946
src/main/java/com/ycl/jxkg/config/spring/exception/ExceptionHandle.java
@@ -1,17 +1,24 @@
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;
/**
@@ -20,9 +27,14 @@
 * 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.
@@ -32,8 +44,9 @@
     */
    @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());
    }
@@ -43,14 +56,30 @@
     * @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);
    }
    /**
@@ -69,5 +98,35 @@
        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);
    }
}