如果出现无法拦截问题,需要在配置文件中添加如下配置

第一步:修改配置文件 application.yml 添加配置如下

spring:
  resources:
    add-mappings: false

第二步:修改 DispatcherServlet

DispatcherServlet 的 throwExceptionIfNoHandlerFound 默认是 false 修改为true,这里利用的是 spring后置处理器,对 DispatcherServlet进行修改


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;

@Configuration
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if(bean instanceof DispatcherServlet){
            System.out.println(bean);
            DispatcherServlet dispatcherServlet = (DispatcherServlet)bean;
            dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

第三步:统一异常类配置 GlobalDefaultExceptionHandler


import com.fdas.openplat.common.enums.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.NoHandlerFoundException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.ConnectException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @desc: 异常统一拦截处理
 * @auth: zhanghy
 * @data: 2019/9/3 13:30
 */
@RestControllerAdvice
@ResponseBody
@Slf4j
public class GlobalDefaultExceptionHandler {

    /**
     * @auth: zhanghy
     * @desc: 服务不存在
     * @data: 2019/9/3 13:31
     * @return: 异常信息
     */
    @ExceptionHandler(value = NoHandlerFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public Map errorHandler(HttpServletRequest request, NoHandlerFoundException exception, HttpServletResponse response,Exception e) {
        return getExceptionInfo(ResultCode.EXCEPTION_404.getMessage(),ResultCode.EXCEPTION_404.getCode(),e);
    }

    /**
     * @auth: zhanghy
     * @desc: 输入参数类型不合法
     * @data: 2019/9/3 13:31
     * @return: 异常信息
     */
    @ExceptionHandler(value = HttpMessageNotReadableException.class)
    public Map httpMessageNotReadableException(HttpMessageNotReadableException e,HttpServletResponse response) {
        return getExceptionInfo(ResultCode.EXCEPTION_4001.getMessage(),ResultCode.EXCEPTION_4001.getCode(),e);
    }

    /**
     * @auth: zhanghy
     * @desc: 请求方式不支持
     * @data: 2019/9/3 13:31
     * @return: 异常信息
     */
    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
    public Map errorHandler(HttpServletRequest request, HttpMediaTypeNotSupportedException exception, HttpServletResponse response,Exception e) {
        return getExceptionInfo(ResultCode.EXCEPTION_406.getMessage(),ResultCode.EXCEPTION_406.getCode(),e);
    }

    /**
     * @auth: zhanghy
     * @desc: 请求方式不支持
     * @data: 2019/9/3 13:31
     * @return: 异常信息
     */
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public Map httpRequestMethodNotSupportedExceptionHandler(HttpServletRequest request, HttpMediaTypeNotSupportedException exception, HttpServletResponse response,Exception e) {
        return getExceptionInfo(ResultCode.EXCEPTION_405.getMessage(),ResultCode.EXCEPTION_405.getCode(),e);
    }

    /**
     * @auth   zhanghy
     * @date   2021/9/10 11:10
     * @desc   请求资源超时
     * @return 异常信息
     */
    @ExceptionHandler({ResourceAccessException.class, ConnectException.class})
    public Map resourceAccessExceptionHandler(HttpServletRequest request, HttpServletResponse response,Exception e) {
        return getExceptionInfo(ResultCode.EXCEPTION_408.getMessage(),ResultCode.EXCEPTION_408.getCode(),e);
    }

    /**
     * @desc: 请求参数缺失
     * @auth: zhanghy
     * @data: 2019/9/18 14:12
     * @return:
     */
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public Map errorMissingServletRequestParameterExceptionHandler(MissingServletRequestParameterException e) {
        return getExceptionInfo("请求缺少参数 " +  e.getParameterName(),ResultCode.EXCEPTION_400.getCode(),e);
    }

    /**
     * @desc: 请求参数类型错误
     * @auth: zhanghy
     * @data: 2019/9/18 14:12
     * @return:
     */
    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    public Map errorMethodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException e) {
        return getExceptionInfo("参数类型错误 " +  e.getParameter().getParameterName(),1003,e);
    }

    /**
     * 业务处理异常
     */
    @ExceptionHandler(SaasException.class)
    public Map saasException(SaasException e) {
        return getExceptionInfo(e.getMsg(),e.getCode(),e);
    }

    /**
     * 数据验证异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map methodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        StringBuffer msg = new StringBuffer();
        for(ObjectError obj: allErrors){
            msg.append(obj.getDefaultMessage());
            break;
        }
        return getExceptionInfo(msg.toString(),500,e);
    }

        /**
     * 总的异常处理
     */
    @ExceptionHandler(Exception.class)
    public Map handleException(Exception e) {
        return getExceptionInfo("error",500,e);
    }

    /**
     * 异常处理响应客户端状态
     */
    public Map getExceptionInfo(String msg, Integer resultcode, Exception e){
        Map resultDate = new HashMap();
        resultDate.put("message",msg);
        resultDate.put("code",resultcode);
        log.error(e.getMessage(),e);
        return resultDate;
    }

第四:异常类型,枚举类编写 ResultCode


/**
 * 全局状态码
 */
public enum ResultCode {
    /**
     * 自定义的返回状态码
     */
  
    EXCEPTION_400(400, "缺失参数"),
    EXCEPTION_4001(4001, "参数类型有误"),
    EXCEPTION_401(401, "认证失败"),
    EXCEPTION_403(403, "禁止访问"),
    EXCEPTION_404(404, "资源不存在"),
    EXCEPTION_405(405, "请求方式有误"),           // 请求方式有误
    EXCEPTION_406(406, "请求资源类型不支持"),
    EXCEPTION_408(408, "请求超时"),
    EXCEPTION_500(500, "请求异常");

    private final int code;

    public String message;

    ResultCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
    public int getCode() {
        return code;
    }
    public int code() {
        return code;
    }
}

 

 

 

最后修改于 2020-05-25 11:40:27
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇