SpringBoot 统一异常拦截处理 (Spring Security filter链中产生的 中的异常无法被拦截处理)

我们用的Spring Security+Oauth2 ,导致在SpringSecurity过滤链中产生的异常并不能被全局异常处理器拦截,
所以@RestControllerAdvice没什么乱用.
网上看了看好像必须实现 ErrorController 去处理


image.png

这个是默认返回的参数,并不是我们项目需要的格式所以还需要进一步改造


image.png

这个获取返回错误参数,就可以自由定义返回结果了
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.context.request.WebRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.Objects;

/**
 * spring security 异常处理
 */
@Slf4j
@RestController
public class CustomErrorController implements ErrorController {
    private static final String PATH = "/error";

    @Autowired
    private ErrorAttributes errorAttributes;

    @RequestMapping(value = PATH)
    Result error(HttpServletRequest request, HttpServletResponse response) {
        // Appropriate HTTP response code (e.g. 404 or 500) is automatically set by Spring.
        // Here we just define response body.
        Map errorMap = getErrorAttributes(request);
        //定义返回格式
        Result d= new Result();
        d.setMessage(Objects.requireNonNull(errorMap.get("message")).toString());
        d.setCode(Integer.valueOf(Objects.requireNonNull(errorMap.get("status")).toString()));
        response.setStatus(HttpServletResponse.SC_OK);
        return d;
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }

    /**
     * 获取请求参数
     * @param request
     * @return
     */
    private Map getErrorAttributes(HttpServletRequest request) {
        WebRequest requestAttributes = new ServletWebRequest(request);
        return errorAttributes.getErrorAttributes(requestAttributes,false);
    }

}

你可能感兴趣的:(SpringBoot 统一异常拦截处理 (Spring Security filter链中产生的 中的异常无法被拦截处理))