spring Cloud 全局异常捕获

通过@RestControllerAdvice来处理。

 

@RestControllerAdvice
public class GlobalExceptionAdvice {
    private final Logger logger = LoggerFactory.getLogger(GlobalExceptionAdvice.class);

    @ExceptionHandler(value = Exception.class)
    public ApiResult<String> handlerAdException(HttpServletRequest request, Exception ex) {
        ApiResult<String> response = new ApiResult<>();
        //返回部分异常
        response.setCodeToError(ex.getMessage());
        //输出完整异常
        logger.error("=========",ex);
        return response;
    }
}

 

ApiResult 是我自己包装的返回结果
public class ApiResult<T> {
    public static final String FAIL_CODE = "0";
    public static final String SUC_CODE = "1";
    public static final String ERROR_CODE = "2";
    public static final String SUC_MESSAGE = "Operate successfully";
    public static final String FAIL_MESSAGE = "Operation failure";
    public static final String ERROR_MESSAGE = "System Error";
    public static final String NOACCESS_MESSAGE = "No permission to access this page.";
 
    private String code = FAIL_CODE;
    private String message = FAIL_MESSAGE;
    private T data;
 
    public String getCode() {
        return code;
    }
 
    public void setCode(String code) {
        this.code = code;
    }
 
    public void setCode(String code, String message) {
        this.code = code;
        this.message = message;
    }
 
    public void setCodeToSuccessed() {
        this.code = SUC_CODE;
        this.message = SUC_MESSAGE;
    }
    public void setCodeToSuccessed(T data) {
        this.data = data;
        this.code = SUC_CODE;
        this.message = SUC_MESSAGE;
    }
    
    public void setCodeToError(String message) {
        this.code = ERROR_CODE;
        this.message = message;
    }
    
    public void setCodeToError() {
        this.code = ERROR_CODE;
        this.message = ERROR_MESSAGE;
    }
 
    public void setCodeToFail(String message) {
        this.code = ERROR_CODE;
        this.message = message;
    }
 
    public void setCodeToFail() {
        this.code = FAIL_CODE;
        this.message = FAIL_MESSAGE;
    }
    
    public void setCodeByNoAccess() {
        this.code = FAIL_CODE;
        this.message = NOACCESS_MESSAGE;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
    
    public boolean isSuccess() {
        return SUC_CODE.equals(code);
    }
 
    public T getData() {
        return data;
    }
 
    public void setData(T data) {
        this.data = data;
    }
    
    
    
}

 

如果你要捕获参数

package com.leadtrans.report.advice;

import com.alibaba.fastjson.JSON;
import com.leadtrans.report.model.base.ApiResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.reflect.Type;

/**
 * @author: Tyler
 * @createDate: 2021/12/24
 */


@RestControllerAdvice
public class GlobalExceptionAdvice implements RequestBodyAdvice {

    private final Logger logger = LoggerFactory.getLogger(GlobalExceptionAdvice.class);

    @Override
    public boolean supports(MethodParameter methodParameter, Type targetType,
                            Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
                                           Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
        return inputMessage;
    }

    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
                                Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
//        RequestMapping requestMapping = parameter.getMethodAnnotation(RequestMapping.class);
//        logger.info("请求地址====>{}", StringUtils.arrayToDelimitedString(requestMapping.value(), ","));
        logger.info("请求地址====>{}",parameter.getMethod().toString());
        logger.info("请求参数====>{}", JSON.toJSONString(body));
        return body;
    }

    @Override
    public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
                                  Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        RequestMapping requestMapping = parameter.getMethodAnnotation(RequestMapping.class);
        logger.info("请求地址====>{}", StringUtils.arrayToDelimitedString(requestMapping.value(), ","));
        return body;
    }

    @ExceptionHandler(value = Exception.class)
    public ApiResponse<String> handlerAdException(HttpServletRequest request, Exception ex) {
        //输出完整异常
        logger.error("=========",ex);
        return new ApiResponse().Fail(ex.getMessage());
    }

}

 

posted @ 2021-06-17 18:37  正怒月神  阅读(316)  评论(0编辑  收藏  举报