SpringBoot自定义错误处理逻辑详解

目录
  • 1. 自定义错误页面
  • 2. @ControllerAdvice+@ExceptionHandler
  • 3. 使用@ResponseStatus处理自定义异常
  • 4. 框架底层异常
  • 5. 自定义异常解析器
  • 6. ErrorViewResolver实现自定义处理异常

1. 自定义错误页面

将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误信息

4xx —— 打印 status 及 message 信息

  <h2 th:text="${status}">page not found</h2>
  <h3 th:text="${#message}">We Couldn't Find This Page</h3>

5xx—— 打印 message 及 trace 信息

	<h3 th:text="${message}">Something went wrong.</h3>
	<p class="nrml-txt" th:text="${trace}">Why not try refreshing you page? Or you can <a href="#" rel="external nofollow" >contact our support</a> if the problem persists.</p>

2. @ControllerAdvice+@ExceptionHandler

自定义全局异常处理类,处理 ArithmeticException 及 NullPointerException 异常

package com.wanqing.admin.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@Slf4j
@ControllerAdvice // 使用此注释
public class GlobalExceptionHandler {
    @ExceptionHandler({ArithmeticException.class, NullPointerException.class
    }) // 使用此注释,大括号内为可以处理的异常信息
    public String handleArithException(Exception e){
        log.info("异常是:" + e);
        return "login"; // 返回一个视图地址(ModelAndView)
    }
}

原理:

使用 ExceptionHandlerExceptionResolver 异常处理器处理用 @ExceptionHandler 注释的异常

3. 使用@ResponseStatus处理自定义异常

自定义异常类示例代码:

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "用户数量太多~~") // 异常可以返回状态码信息
public class userToMany extends  RuntimeException{
    // 有参构造器
    public userToMany(String message){
        super(message);
    }
    public userToMany(){
    }
}

原理:

ResponseStatusExceptionResolver 处理器可以处理 @ResponseStatus 注解的异常,得到 @ResponseStatus 注解的信息,调用 response.sendError(statusCode) 方法将错误信息返回,并发送 /error 请求,交由底层处理

sendError —— 表示此次请求立刻结束,发出 /error 请求,SpringBoot 找谁能处理,都不能处理返回默认的错误页

    protected ModelAndView applyStatusAndReason(int statusCode, @Nullable String reason, HttpServletResponse response) throws IOException {
        if (!StringUtils.hasLength(reason)) {
            response.sendError(statusCode);
        } else {
            String resolvedReason = this.messageSource != null ? this.messageSource.getMessage(reason, (Object[])null, reason, LocaleContextHolder.getLocale()) : reason;
            response.sendError(statusCode, resolvedReason);
        }
        return new ModelAndView();
    }

4. 框架底层异常

使用 DefaultHandlerExceptionResolver 异常处理器能处理 SpringMVC 底层异常,其能处理我异常种类如下

    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
        try {
            if (ex instanceof HttpRequestMethodNotSupportedException) {
                return this.handleHttpRequestMethodNotSupported((HttpRequestMethodNotSupportedException)ex, request, response, handler);
            }
			// 此处省略.............
            if (ex instanceof HttpMessageNotWritableException) {
                return this.handleHttpMessageNotWritable((HttpMessageNotWritableException)ex, request, response, handler);
            }
            if (ex instanceof MethodArgumentNotValidException) {
                return this.handleMethodArgumentNotValidException((MethodArgumentNotValidException)ex, request, response, handler);
            }
        } catch (Exception var6) {
            if (this.logger.isWarnEnabled()) {
                this.logger.warn("Failure while trying to resolve exception [" + ex.getClass().getName() + "]", var6);
            }
        }
        return null;
    }

5. 自定义异常解析器

自定义异常解析器需要满足以下:

  • 实现 HandlerExceptionResolver 接口并注册到容器中(@Component)
  • 在自定义解析器中实现 resolveException 方法,方法内可通过 sendError 方法返回错误信息并返回一空视图,交给底层将错误信息解析拼接为最终页面
  • 可以通过 @Order 注释调整自定义异常解析器的优先级,value越小优先级越高

自定义异常解析器示例代码:

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Order(value = Ordered.HIGHEST_PRECEDENCE) // 优先级数字越小,优先级越高
@Component // 注册到容器中
public class CustomerHandlerResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        try {
            httpServletResponse.sendError(511, "我不喜欢的错误");
        } catch (IOException e1){
            e1.printStackTrace();
        }
        return new ModelAndView();
    }
}

自定义异常处理器被加入(未调整优先级时,默认加到最后):

6. ErrorViewResolver实现自定义处理异常

交由ErrorViewResolver的情况 :

情况一: response.sendError ,error 请求转给 Controller

情况二: 判断异常请求无人处理,tomcat 底层 response.sendError

ErrorViewResolver处理方法:

BasicErrorController 得到要去的地址后由 ErrorViewResolver 解析,解析规则为拼接状态码等信息

—— 即 ErrorViewResolver 是最后的异常处理, 没人处理的异常,被它处理

到此这篇关于SpringBoot自定义错误处理逻辑详解的文章就介绍到这了,更多相关SpringBoot错误处理逻辑内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot错误处理机制以及自定义异常处理详解

    上篇文章我们讲解了使用Hibernate Validation来校验数据,当校验完数据后,如果发生错误我们需要给客户返回一个错误信息,因此这节我们来讲解一下SpringBoot默认的错误处理机制以及如何自定义异常来处理请求错误. 一.SpringBoot默认的错误处理机制 我们在发送一个请求的时候,如果发生404 SpringBoot会怎么处理呢?我们来发送一个不存在的请求来验证一下看看页面结果.如下所示: 当服务器内部发生错误的时候,页面会返回什么呢? @GetMapping("/user/{

  • SpringBoot 错误处理机制与自定义错误处理实现详解

    [1]SpringBoot的默认错误处理 ① 浏览器访问 请求头如下: ② 使用"PostMan"访问 { "timestamp": 1529479254647, "status": 404, "error": "Not Found", "message": "No message available", "path": "/aaa1&q

  • Springboot实现自定义错误页面的方法(错误处理机制)

    一般我们在做项目的时候,错误机制是必备的常识,基本每个项目都会做错误处理,不可能项目一报错直接跳到原始报错页面,本篇博客主要针对springboot默认的处理机制,以及自定义错误页面处理进行讲解,需要的朋友们下面随着小编来一起学习学习吧! 默认效果示例 springboot他是有自己默认的处理机制的.在你刚创建一个springboot项目去访问一个没有的路径会发现他是会弹出来这样的信息. 而我们用postman直接接口访问,会发现他返回的不再是页面.默认响应一个json数据 这时候该有人在想,s

  • Springboot错误处理机制实现原理解析

    1.默认的错误机制 默认效果 ①在浏览器中访问不存在的请求时,springboot默认返回一个空白页面 浏览器的请求头 ②客户端访问时,返回json数据 { "timestamp": "2020-03-24T02:49:56.572+0000", "status": 404, "error": "Not Found", "message": "No message availa

  • Springboot异常错误处理解决方案详解

    1.在有模板引擎的情况下: springboot会默认找 templates/error/错误状态码.html,所以我们要定制化错误页面就可以到templates/error下创建一个[对应错误状态码.html]html文件,当发生此状态码的错误springboot就会来到对应的页面. 同时如果我们想让400-499之间的错误都去同一个错误页面,那我们可以在templates/error下创建一个4xx.html.同理500-599的错误可以用5xx.html. 注意:springboot会优先

  • SpringBoot错误处理流程深入详解

    目录 一.错误处理 二.底层相关组件 三.异常处理流程 四.定制错误处理逻辑 1.自定义错误页面 2.使用注解或者默认的异常处理 3.自定义异常处理解析器 一.错误处理 默认情况下,Spring Boot提供/error处理所有错误的映射 对于机器客户端(例如PostMan),它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息(如果设置了拦截器,需要在请求头中塞入Cookie相关参数) 对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据

  • SpringBoot2.1.4中的错误处理机制

    目录 SpringBoot 2.1.4 错误处理机制 SpringBoot错误机制原理 SpringBoot 2.1.3 错误处理机制 引用的问题做个标记 错误处理机制 SpringBoot 2.1.4 错误处理机制 springboot的自动配置中帮我们配置了相关的错误处理组件,例如访问一个不存在的页面,就会出现下面的错误页面,上面也会显示相应的信息 在Postman软件中模拟移动端访问,会获取如下响应的json数据: 可以发现springboot的错误处理机制很好的适应了不同客户端访问,浏览

  • springboot 错误处理小结

    在 java web开发过程中,难免会有一些系统异常或人为产生一些异常.在 RESTful springboot 项目中如何优雅的处理? 分析:在RESTful 风格的springboot 项目中,返回的都是 body 对象,所以定义一个结果基类,其中包含 status,message,data(请求方法的返回结果),是比较合适的. 如果定义多个异常类进行处理,会比较麻烦.比如StudentNotExistsException.StudentExistsException...等,并且不能指定错

  • SpringBoot自定义错误处理逻辑详解

    目录 1. 自定义错误页面 2. @ControllerAdvice+@ExceptionHandler 3. 使用@ResponseStatus处理自定义异常 4. 框架底层异常 5. 自定义异常解析器 6. ErrorViewResolver实现自定义处理异常 1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误信息 4xx —— 打印 status

  • SpringBoot自定义启动器Starter流程详解

    目录 一.背景 二.自定义启动器 1.创建一个启动器的自动配置模块 2.创建一个启动器模块 3.在业务模块中引入启动器 一.背景 虽然Spring官方给我们提供了很多的启动器供我们使用 但有时候我们也会遇到某些特殊场景,这些启动器满足不了 这个时候就需要自定义一个启动器供我们使用 二.自定义启动器 在之前学习Spring Boot的过程中,我们已经对启动器有了一个大致的了解 Spring Boot实现某个功能,一般是引入对应场景的启动器(一般不写代码,只是声明这个启动器需要引用哪些依赖),然后这

  • SpringBoot自定义Starter实现流程详解

    目录 starter起步依赖 starter命名规则 自定义starter new module 添加依赖 simplebean 自动配置类 META-INF\spring.factories 在spring-boot-mytest中引入mystarter-spring-boot-starter 添加配置 通过@Autowired引用 启动访问 starter起步依赖 starter起步依赖是springboot一种非常重要的机制, 它打包了某些场景下需要用到依赖,将其统一集成到starter,

  • php 自定义错误日志实例详解

    php 自定义错误日志 项目中需要对定义错误日志及时处理, 那么就需要修改自定义错误日志的输出方式(写日志.发邮件.发短信)   一. register_shutdown_function(array('phperror','shutdown_function')); //定义PHP程序执行完成后执行的函数 函数可实现当程序执行完成后执行的函数,其功能为可实现程序执行完成的后续操作.程序在运行的时候可能存在执行超时,或强制关闭等情况,但这种情况下默认的提示是非常不友好的,如果使用register

  • SpringBoot实现自定义事件的方法详解

    目录 简介 步骤1:自定义事件 步骤2:自定义监听器 方案1:ApplicationListener 方案2:SmartApplicationListener 步骤3:注册监听器 法1:@Component(适用于所有监听器) 法2:application.yml中添加配置 法3:启动类中注册 步骤4:发布事件 法1:注入ApplicationContext,调用其publishEvent方法 法2:启动类中发布 简介 说明 本文用实例来介绍如何在SpringBoot中自定义事件来使用观察者模式

  • springboot使用logback文件查看错误日志过程详解

    这篇文章主要介绍了springboot使用logback文件查看错误日志过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 <?xml version="1.0" encoding="UTF-8"?> <!-- 从高到地低 OFF . FATAL . ERROR . WARN . INFO . DEBUG . TRACE . ALL --> <!-- 日志输出规则 根据当前ROOT

  • SpringBoot Jpa 自定义查询实现代码详解

    这篇文章主要介绍了SpringBoot Jpa 自定义查询实现代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 持久层Domain public interface BaomingDao extends JpaRepository<BaomingBean,Integer> { @Query(value = "select distinct t.actid from BaomingBean t where t.belongs=?

  • SpringBoot整合Shiro的方法详解

    目录 1.Shito简介 1.1 什么是shiro 1.2 有哪些功能 2.QuickStart 3.SpringBoot中集成 1.导入shiro相关依赖 2.自定义UserRealm 3.定义shiroConfig 4.新建页面进行测试 1.Shito简介 1.1 什么是shiro Apache Shiro是一个java安全(权限)框架 Shiro可以非常容易的开发出足够好的应用,其不仅可以用在javase环境,也可以用在javaee环境 shiro可以完成,认证,授权,加密,会话管理,we

随机推荐