spring boot 项目在自定义Filter中抛出异常捕获不到的处理方法

一、序言

全局异常处理@RestControllerAdvice并非可以解决所有异常返回信息,
像是在Filter中的异常,Advice就失效了,就需要从别的方面进行入手

二、解决问题

1、代码实现

添加下方这个类,即可完美解决问题,其中ResponseEntity为spring自带类,Result为自定义返回前端实体类
请重点注意,我这里是采用@Override,也就是重写了error方法,也只有这样才能实现效果

import com.dely.common.entity.Result;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @author ruiMin
 * @date 2020/2/20 21:55
 */
@RestController
public class ErrorController extends BasicErrorController {

	/**
	* 必须实现的一个构造方法
	**/
    public ErrorController() {
        super(new DefaultErrorAttributes(), new ErrorProperties());
    }

    /**
     * produces 设置返回的数据类型:application/json
     *
     * @param request 请求
     * @return 自定义的返回实体类
     */
    @Override
    @RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));
        HttpStatus status = getStatus(request);
        // 获取错误信息
        String message = body.get("message").toString();

        return new ResponseEntity<>(Result.error(message), status);
    }
}

2、效果

这里就实现了按我自定义的格式发送消息,原效果请看下方原理解析图片
在这里插入图片描述

3、原理解析

其实原理也不复杂,就是,springboot在遇到错误的时候,是由自己的一套错误提示逻辑的,如以下图两种情况,由于我的项目是前后端分离项目,故这里只针对第二种进行重写,我们做的方法,就是继承BasicErrorController,然后重写关于ajax请求的实体信息返回

1)页面访问的形式
spring boot 项目在自定义Filter中抛出异常捕获不到的处理方法_第1张图片
2)ajax接口访问形式
spring boot 项目在自定义Filter中抛出异常捕获不到的处理方法_第2张图片

4、Result类


import com.dely.common.constant.HttpStatus;
import java.util.HashMap;

/**
 * 用于返回成功失败错误的结果信息及状态
 *
 * @author ruiMin
 * @date 2019-09-20 20:18
 */
public class Result extends HashMap<String, Object> {

    /**
     * 状态码
     */
    private String status = "status";
    /**
     * 返回内容
     */
    private String message = "message";
    /**
     * 数据对象
     */
    private String data = "data";


    public Result() {
    }

    /**
     * 初始化一个新创建的 Result 对象
     *
     * @param status
     * @param message
     */
    public Result(Integer status, Object message) {
        this.put(this.status, status);
        this.put(this.message, message);
    }

    /**
     * 初始化一个新创建的 Result 对象
     *
     * @param message
     * @param data
     */
    public Result(Integer status, Object message, Object data) {
        this.put(this.status, status);
        this.put(this.message, message);
        this.put(this.data, data);
    }

    /**
     * 自定义拓展状态消息
     */
    public static Result msg(Integer status, Object msg) {
        return new Result(status, msg, null);
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static Result success() {
        return Result.success("操作成功");
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static Result success(Object data) {
        return Result.success("操作成功", data);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */
    public static Result success(String msg) {
        return Result.success(msg, null);
    }

    /**
     * 返回成功消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static Result success(String msg, Object data) {
        return new Result(HttpStatus.SUCCESS, msg, data);
    }

    /**
     * 返回失败消息
     *
     * @return 失败消息
     */
    public static Result fail() {
        return Result.fail("操作失败");
    }

    /**
     * 返回失败消息
     *
     * @param msg 返回内容
     * @return 失败消息
     */
    public static Result fail(String msg) {
        return Result.fail(msg, null);
    }

    /**
     * 返回失败消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 失败消息
     */
    public static Result fail(String msg, Object data) {
        return new Result(HttpStatus.FAIL, msg, data);
    }

    /**
     * 特定状态码返回失败信息
     *
     * @param status 状态
     * @param msg    信息
     * @return
     */
    public static Result fail(Integer status, String msg) {
        return new Result(status, msg, null);
    }

    /**
     * 返回错误消息
     *
     * @return 错误消息
     */
    public static Result error() {
        return Result.error("未知异常,请联系管理员");
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 错误消息
     */
    public static Result error(String msg) {
        return Result.error(msg, null);
    }

    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 错误消息
     */
    public static Result error(String msg, Object data) {
        return new Result(HttpStatus.ERROR, msg, data);
    }

    /**
     * 特定状态码返回错误信息
     *
     * @param status 状态
     * @param msg    信息
     * @return
     */
    public static Result error(Integer status, String msg) {
        return new Result(status, msg, null);
    }

    @Override
    public Result put(String key, Object value) {
        super.put(key, value);
        return this;
    }

}

你可能感兴趣的:(java,spring,springmvc)