Spring Bootグローバル例外処理(400/404/500)ついでにフィルタで異常がキャプチャされていない問題を解決し、RestApiがいつでも統一されたフォーマットコードを取得できるようにする


出発点は,システムが異常を投げ出した場合でもフロントエンドが統一されたメッセージフォーマットを取得できるため,バックエンドのすべての異常をキャプチャし,処理するためである.
Spring bootは例外を処理する場合、500/404はデフォルトで/errorに転送されますが、この例外の処理クラスは
ErrorController,        
ErrorController     :
@RestController
public class GlobalExceptionController extends AbstractErrorController {
    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionController.class);
    private static final String ERROR_PATH = "/error";

    public GlobalExceptionController(ErrorAttributes errorAttributes) {
        super(errorAttributes);
    }

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

    @RequestMapping(value = ERROR_PATH)
    public Response error(HttpServletRequest request) {
        WebRequest webRequest = new ServletWebRequest(request);
        Throwable e = getError(webRequest);
        if (e == null) {
            Map attributes = getErrorAttributes(request, false);
            Object timestamp = attributes.get("timestamp");
            Object status = attributes.get("status");
            String error = attributes.get("error").toString();
            Object path = attributes.get("path");
            LOGGER.error("status {} error {} path{} timestamp {}", status, error, path, timestamp);
            return Response.failure(Integer.parseInt(status.toString()), error);
        }
        if (e instanceof TokenExpiredException) {
            TokenExpiredException tokenExpiredException = (TokenExpiredException) e;
            return Response.failure(tokenExpiredException.getHttpStatus().value(), tokenExpiredException.getHttpStatus().getReasonPhrase());
        } else if (e instanceof CodeException) {
            CodeException codeException = (CodeException) e;
            String message = e.getMessage();
            if (StringUtils.isEmpty(message)) {
                message = String.format("[%s][%s]", codeException.getErrCode(), codeException.getErrMsg());
            }
            return Response.failure(message);
        } else {
            return Response.failure("    ,     ");
        }
    }

    private Throwable getError(WebRequest webRequest) {
        return (Throwable) this.getAttribute(webRequest, "javax.servlet.error.exception");
    }

    private Object getAttribute(RequestAttributes requestAttributes, String name) {
        return requestAttributes.getAttribute(name, 0);
    }
}