zoukankan      html  css  js  c++  java
  • SpringBoot2 全局异常处理

    参考这篇文章里面的几种异常形式:

    全局异常处理是个比较重要的功能,一般在项目里都会用到。 
    大概把一次请求分成三个阶段,来分别进行全局的异常处理。 
    一:在进入Controller之前,譬如请求一个不存在的地址,404错误。 
    二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。 
    三:以上都正常时,在controller里执行逻辑代码时出的异常。譬如NullPointerException。 
    http://blog.csdn.net/tianyaleixiaowu/article/details/70145251

    直接将编写的全局异常处理类放入项目中,配置@Controller将类载入spring中即可使用,不需要任何配置。

    以下是我写的异常处理类:

    package com.archibladwitwicke.springboot2.chapter03.controller;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
    import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    
    @Controller
    public class GlobalErrorController extends AbstractErrorController {
        private static final String ERROR_PATH = "/error";
        private Log log = LogFactory.getLog(GlobalErrorController.class);
    
        @Autowired
        ObjectMapper objectMapper;
    
        public GlobalErrorController() {
            super(new DefaultErrorAttributes());
        }
    
        @RequestMapping(ERROR_PATH)
        public ModelAndView getErrorPath(HttpServletRequest request, HttpServletResponse response) {
            Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
                    request, false));
            Throwable cause = getCause(request);
            int status = (Integer) model.get("status");
            //错误信息
            String message = (String) model.get("message");
            //友好提示
            String errorMessage = getErrorMessage(cause);
    
            String requestPath = (String) model.get("path");
    
    
            //后台打印日志信息方方便查错
            log.info(status + ":" + message, cause);
            log.info("requestPath---" + ":" + requestPath);
    
            //后台打印日志信息方方便查错
            log.info(message, cause);
            response.setStatus(status);
            if (!isJsonRequest(request, model)) {
                ModelAndView view = new ModelAndView("/error.btl");
                view.addAllObjects(model);
                view.addObject("status", status);
                view.addObject("errorMessage", errorMessage);
                view.addObject("cause", cause);
                return view;
    
            } else {
                Map<String, Object> error = new HashMap<>();
                error.put("success", false);
                error.put("errorMessage", getErrorMessage(cause));
                error.put("message", message);
                writeJson(response, error);
                return null;
            }
    
    
        }
    
        private boolean isJsonRequest(HttpServletRequest request, Map<String, Object> model) {
            // 修复bug,在此类中,使用request无法获取requestPath
            String requestPath = (String) model.get("path");
            if (requestPath.endsWith(".json")) {
                return true;
            } else {
                return (request.getHeader("accept").contains("application/json") || (request.getHeader("X-Requested-With") != null
                        && request.getHeader("X-Requested-With").contains("XMLHttpRequest")));
            }
        }
    
        private void writeJson(HttpServletResponse response, Map<?, ?> error) {
            response.setContentType("application/json;charset=utf-8");
            try {
                response.getWriter().write(objectMapper.writeValueAsString(error));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private String getErrorMessage(Throwable ex) {
            /*不给前端显示详细错误*/
            return "服务器错误,请联系管理员";
        }
    
        private Throwable getCause(HttpServletRequest request) {
            Throwable error = (Throwable) request.getAttribute("javax.servlet.error.exception");
            if (error != null) {
                while (error instanceof ServletException && error.getCause() != null) {
                    error = ((ServletException) error).getCause();
                }
            }
            return error;
        }
    
        @Override
        public String getErrorPath() {
            return ERROR_PATH;
        }
    }
    

      

    可以根据项目具体修改这个方法,将判断ajax请求的种类进行完善,其余的部分可以不用修改:

    private boolean isJsonRequest(HttpServletRequest request, Map<String, Object> model) {
            // 修复bug,在此类中,使用request无法获取requestPath
            String requestPath = (String) model.get("path");
            if (requestPath.endsWith(".json")) {
                return true;
            } else {
                return (request.getHeader("accept").contains("application/json") || (request.getHeader("X-Requested-With") != null
                        && request.getHeader("X-Requested-With").contains("XMLHttpRequest")));
            }
        }
    

      

    此异常类可以对上述三种异常情况进行拦截处理,显示自定义的异常处理页面或异常处理数据。

  • 相关阅读:
    56.字符流中第一个不重复的数
    55.表示数值的字符串
    54.正则表达式匹配
    53.构建乘积数组
    52.数组中重复的数字
    51.把字符串转化为整数
    50.不用加减乘除求和
    49.求1+2+3+.......+n
    The great pleasure in life is doing what people say you cannot do.
    mkcert本地 HTTPS 加密证书生成工具
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/8591884.html
Copyright © 2011-2022 走看看