springboot全局异常控制处理

来源:互联网 发布:36o软件管家下载 编辑:程序博客网 时间:2024/05/22 06:28

分三类进行讨论
1.请求404时候,如果配置文件开启了spring.resources.add-mappings=false
,表示不开启默认的资源处理,采用

@Configurationpublic class WebMvcConfigurer extends WebMvcConfigurerAdapter

去处理时候,404异常可以获取到。
可是设置为true时候,404捕捉不到。需要自己

public class NotFoundController implements ErrorController 

去写里面方法进行处理,至于具体原因也不清楚为什么,通过测试得知。有知道的人请告知下谢谢。

2.当请求进来时候,service处理时候自定义抛出的异常
3.请求进来时候,服务器错误

第一种代码

@RestControllerpublic class NotFoundController implements ErrorController {    @Override    public String getErrorPath() {        return "/erro";    }    @RequestMapping(value = "/error")    public Object error(HttpServletResponse response, HttpServletRequest request) {        Result result = new Result();        result.setCode(ResultCode.NOT_FOUND).setMessage("接口 [" + request.getRequestURI() + "] 不存在");        response.setCharacterEncoding("UTF-8");        response.setHeader("Content-type", "application/json;charset=UTF-8");        response.setStatus(200);        try {            response.getWriter().write(JSON.toJSONString(result));        } catch (IOException e) {            e.printStackTrace();        }        return new ModelAndView();    }}

第2,3种代码

@Configurationpublic class WebMvcConfigurer extends WebMvcConfigurerAdapter {    private final Logger logger = LoggerFactory.getLogger(WebMvcConfigurer.class);    //统一异常处理    @Override    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {        exceptionResolvers.add(new HandlerExceptionResolver() {            @Override            public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {                Result result = new Result();                if (handler instanceof HandlerMethod) {                    HandlerMethod handlerMethod = (HandlerMethod) handler;                    if (e instanceof ServiceException) {//业务失败的异常,如“账号或密码错误”                        result.setCode(ResultCode.FAIL).setMessage(e.getMessage());                        logger.error(e.getMessage());                    } else {                        result.setCode(ResultCode.INTERNAL_SERVER_ERROR).setMessage("接口 [" + request.getRequestURI() + "] 内部错误,请联系管理员");                        String message = String.format("接口 [%s] 出现异常,方法:%s.%s,异常摘要:%s",                                request.getRequestURI(),                                handlerMethod.getBean().getClass().getName(),                                handlerMethod.getMethod().getName(),                                e.getMessage());                        logger.error(message, e);                    }                } else {                    if (e instanceof NoHandlerFoundException) {                        result.setCode(ResultCode.NOT_FOUND).setMessage("接口 [" + request.getRequestURI() + "] 不存在");                    } else {                        result.setCode(ResultCode.INTERNAL_SERVER_ERROR).setMessage(e.getMessage());                        logger.error(e.getMessage(), e);                    }                }                responseResult(response, result);                return new ModelAndView();            }        });    }   private void responseResult(HttpServletResponse response, Result result) {        response.setCharacterEncoding("UTF-8");        response.setHeader("Content-type", "application/json;charset=UTF-8");        response.setStatus(200);        try {            response.getWriter().write(JSON.toJSONString(result));        } catch (IOException ex) {            logger.error(ex.getMessage());        }    }}