SpringBoot系列<五>全局异常处理

拼搏现实的明天。 2022-06-03 01:16 262阅读 0赞

1、介绍

在日常开发中发生了异常,往往是需要通过一个统一的异常处理处理所有异常,来保证客户端能够收到友好的提示。SpringBoot在页面 发生异常的时候会自动把请求转到/error,SpringBoot内置了一个BasicErrorController对异常进行统一的处理,当然也可以自定义这个路径,默认为/error

  1. server:
  2. error:
  3. path: /custom/error

BasicErrorController提供两种返回错误一种是页面返回、当你是页面请求的时候就会返回页面,另外一种是json请求的时候就会返回json错误


2、通用Exception处理

通过使用@ControllerAdvice来进行统一异常处理,@ExceptionHandler(value = Exception.class)来指定捕获的异常
下面针对两种异常进行了特殊处理分别返回页面和json数据,使用这种方式有个局限,无法根据不同的头部返回不同的数据格式,而且无法针对404、403等多种状态进行处理

全局异常请求处理代码如下:

定义异常处理类:

  1. @RestControllerAdvice
  2. public class GlobalControllerExceptionHandler {
  3. private static final Log LOG=LogFactory.getLog(GlobalControllerExceptionHandler.class);
  4. @ExceptionHandler(value = Exception.class)
  5. public ModelAndView globalErrorHandler(Exception ex) {
  6. LOG.error(ex);
  7. ModelAndView modelAndView = new ModelAndView();
  8. modelAndView.setViewName("defaultError");
  9. return modelAndView;
  10. }
  11. @ExceptionHandler(value = GlobalRunTimeException.class)
  12. public Map myExceptionHandler(GlobalRunTimeException ex){
  13. Map map = new HashMap();
  14. map.put("code", ex.getCode());
  15. map.put("message" , ex.getMessage());
  16. return map;
  17. }

自定义异常:

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class GlobalRunTimeException extends RuntimeException implements Serializable{
  5. private static final long serialVersionUID = -4156688065333355731L;
  6. private String code;
  7. private String message;
  8. }

测试Controller:

  1. @RequestMapping(value = "/ex")
  2. public void testException() throws Exception{
  3. throw new Exception();
  4. //throw new GlobalRunTimeException("1001","自定义全局错误");
  5. }

自定义的默认异常处理页:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8" />
  5. <title>统一异常处理</title>
  6. </head>
  7. <body>
  8. <h1>默认异常处理页面</h1>
  9. </body>
  10. </html>

注:这里采用的是JSP解析,所以系统会去根据SpringMVC视图解析配置去寻找defaultError页面;


3、自定义BaseErrorController继承BasicErrorController处理错误

BaseErrorController可以根据自己的需求自定义errorHtml()和error()两个方法,实现不同的请求不同的返回,具体的可以看下BasicErrorController该类;

SpringBoot提供了一种特殊的Bean定义方式,可以让我们容易的覆盖已经定义好的Controller,原生的BasicErrorController是定义在ErrorMvcAutoConfiguration中的

具体代码如下:

  1. @Bean
  2. @ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
  3. public BasicErrorController basicErrorController(ErrorAttributes errorAttributes) {
  4. return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
  5. this.errorViewResolvers);
  6. }

可以看到这个注解@ConditionalOnMissingBean 意思就是定义这个bean 当 ErrorController.class 这个没有定义的时候, 意思就是说只要我们在代码里面定义了自己的ErrorController.class时,这段代码就不生效了,所以我们只需要自定义一个ErrorController接口类,并在ErrorMvcAutoConfiguration.class之前先加载自定义的ErrorController接口类即可;

我这里的是选择继承默认的BasicErrorController.class,重写需要自定义的部分,更多的去看下BasicErrorController该类及该类关联关系;

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springboot 全局异常处理

    在实际项目中,我们经常会遇到关于异常处理的问题,异常是不能抛给用户看的,所以就要求我们给用户一个友好的提示或者在抛出异常之前捕获异常。有时异常中包含提示信息,所以我们只能在控制

    相关 Springboot 全局异常处理

    最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项目是基于Springboot的,所以去网络上找了一些博客文档,然后再结合项目本身的一些特殊需求