SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解

 更新时间:2022年10月28日 10:13:57   作者:showswoller  
在Spring Boot应用的开发中,不管是对底层数据库操作,对业务层操作,还是对控制层操作,都会不可避免的遇到各种可预知的,不可预知的异常需要处理,如果每个处理过程都单独处理异常,那么系统的代码耦合度会很高,工作量大且不好统一,以后维护的工作量也很大

前言

如果能将所有类型的异常处理从各层中解耦出来,则既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。幸运的是,Spring框架支持这样的实现。接下来将从自定义error页面。@ExceptionHandler注解以及@ControllerAdvice3种方式讲解Spring Boot应用的异常统一处理

具体处理步骤如下:

自定义error页面

在Spring Boot Web应用的src/main/resources/templates 目录下添加error.html页面 访问发生错误或异常时,Spring Boot将自动找到该页面作为错误页面。Spring Boot为错误页面提供了以下属性

  • timestamp 错误发生时间
  • status HTTP状态码
  • error 错误原因
  • exception 异常的类名
  • message 异常消息
  • errors BindingResult异常里的各种错误
  • trace 异常跟踪信息
  • path 错误发生时请求的URL路径

1: 创建名为com.ch.ch5_3.exception的包 并在该包中创建名为MyException 具体代码如下

package com.ch.ch5_3.exception;
public class MyException extends Exception {
	private static final long serialVersionUID = 1L;
	public MyException() {
		super();
	}
	public MyException(String message) {
		super(message);
	}
}

2:创建控制器类TestHandleExceptionController

创建名为com.ch,ch5_3.controller的包 并在该包中创建名为TestHandleExceptionController的控制器类,在该控制器类中,在4个请求处理方法,一个是导航到index.html 另外三个分别抛出不同的异常 部分代码如下

package com.ch.ch5_3.controller;
import java.sql.SQLException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
    public void db() throws SQLException { 
        throw new SQLException("数据库异常");
    }  
	@RequestMapping("/my")  
    public void my() throws MyException {  
        throw new MyException("自定义异常");
    }
	@RequestMapping("/no")  
    public void no() throws Exception {  
        throw new Exception("未知异常");
    } 
}

3:View视图页面

Thymeleaf模板默认将视图页面放在src/main/resources/templates目录下。因此我们在src/main/resources/templates 目录下新建html页面文件,index.html和error.html

在index.html页面中 有4个超链接请求,3个请求在控制器中有对应处理,另一个请求是404错误

部分代码如下

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>index</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow"  rel="external nofollow"  />
<!-- 默认访问 src/main/resources/static下的css文件夹-->
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow"  rel="external nofollow"  />
				<a th:href="@{db}" rel="external nofollow" >处理数据库异常</a><br>
				<a th:href="@{my}" rel="external nofollow" >处理自定义异常</a><br>
				<a th:href="@{no}" rel="external nofollow" >处理未知错误</a>
				<hr>
				<a th:href="@{nofound}" rel="external nofollow" >404错误</a>
			</div>
		</div>
	</div>
</body>
</html>

error.html页面部分代码如下

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>error</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow"  rel="external nofollow"  />
<!-- 默认访问 src/main/resources/static下的css文件夹-->
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow"  rel="external nofollow"  />
</head>
<body>
            <div class="common-hint-word">
                <div th:text="${#dates.format(timestamp,'yyyy-MM-dd HH:mm:ss')}"></div>
                <div th:text="${message}"></div>
                <div th:text="${error}"></div>
            </div>
        </div>
    </div>
</body>
</html>

@ExceptionHandler注解

上面自定义页面并没有处理异常,可以使用@ExceptionHandler注解处理异常,如果有一个由该注解修饰的方法,那么当任何方法抛出异常时都由它来处理

添加一个注解修饰的方法 具体代码如下

@ExceptionHandler(value=Excetption.class)
public String handlerException(Exception e){
if(e istanceof SQLException){
return "sql error";
}
else if(e instanceof MYException){
return"myError";
}
else{
return "noerror";
}
}

@ControllerAdvice注解

使用它注解的类时当前Spring Boot应用中所有类的统一异常处理类,该类中使用@ExceptionHandler注解的方法统一处理异常,不需要在每个Controller中逐一定义异常处理方法,这是因为对所有注解了@ControllerAdvice注解进行全局异常处理

创建GlobalExceptionHandlerController的类 具体代码如下

package com.ch.ch5_3.controller;
import java.sql.SQLException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.ch.ch5_3.exception.MyException;
@ControllerAdvice
public class GlobalExceptionHandlerController {
	@ExceptionHandler(value=Exception.class)
	public String handlerException(Exception e) {
		//数据库异常
		if (e instanceof SQLException) {
			return "sqlError";
		} else if (e instanceof MyException) {//自定义异常
			return "myError";
		} else {//未知异常
			return "noError";
		}
	}
}

到此这篇关于SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解的文章就介绍到这了,更多相关SpringBoot @ExceptionHandler与@ControllerAdvice内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单了解java类的初始化以及类的实例化

    简单了解java类的初始化以及类的实例化

    这篇文章主要介绍了简单了解java类的初始化以及类的实例化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Java面向对象之类的继承介绍

    Java面向对象之类的继承介绍

    大家好,本篇文章主要讲的是Java面向对象之类的继承介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 解决Spring MVC中文乱码的编码配置

    解决Spring MVC中文乱码的编码配置

    这篇文章主要为大家介绍了解决SpringMVC中文乱码的编码配置示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Stream中的Peek操作代码

    Stream中的Peek操作代码

    这篇文章主要介绍了Stream中的Peek操作,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 深入Java分布式计算的使用分析

    深入Java分布式计算的使用分析

    本篇文章对Java分布式计算的使用进行了详细的介绍。需要的朋友参考下
    2013-05-05
  • MyBatis中执行SQL语句的几种方式总结

    MyBatis中执行SQL语句的几种方式总结

    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,下面这篇文章主要给大家介绍了关于MyBatis中执行SQL语句的几种方式,需要的朋友可以参考下
    2024-04-04
  • 通过实例分析java多态

    通过实例分析java多态

    这篇文章主要介绍了通过实例分析java多态,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java实现用户自动登录

    java实现用户自动登录

    这篇文章主要为大家详细介绍了java用户自动登录的实现方法,分为六个步骤实现用户自动登录,并验证用户是否已经登录,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • SpringBoot整合Lombok插件与使用详解

    SpringBoot整合Lombok插件与使用详解

    Lombok是Java开发的插件,通过注解自动生成常用代码,如getter/setter,节省开发时间,提高效率,它在编译期生成方法,不影响性能,安装Lombok需要添加Maven依赖和IDEA插件,使用注解如@Data、@Getter等简化代码编写,官网提供详细文档
    2024-09-09
  • java调用python代码的两种实现方式:Runtime.exec()和Jython

    java调用python代码的两种实现方式:Runtime.exec()和Jython

    在Java中调用Python代码有多种方法,包括使用Runtime.exec()和第三方库如Jython,Runtime.exec()通过系统命令执行Python脚本,适用于简单的调用场景,Jython则是一个Python的Java实现,允许在Java中直接运行Python代码,适用于更深层次的集成需求
    2025-01-01

最新评论