深入聊一聊springboot项目全局异常处理那些事儿

深入聊一聊Spring Boot项目全局异常处理那些事儿

Spring Boot是一个非常流行的Java框架,其主要优点之一是非常简单地设置全局异常处理程序。本文将在解释全局异常处理的基本概念的基础上,提供两个示例,以帮助你更好地理解和使用此功能。

SpringBoot全局异常处理基础知识

全局异常处理是指在整个应用程序中捕获并处理抛出的异常。对于Java应用程序而言,全局异常处理在某些情况下非常重要,因为它可以大大提高应用程序的可靠性。

Spring Boot的全局异常处理主要通过自定义异常处理器实现。在Spring中,异常处理器主要通过实现HandlerExceptionResolver接口来实现。Spring Boot则提供了一个更简单的方式来处理异常:通过添加@ControllerAdvice注解的类。

@ControllerAdvice是一个用于定义@ExceptionHandler@InitBinder@ModelAttribute方法的注解。其中,@ExceptionHandler被用于处理异常。

以下是一些基本的全局异常处理方法。

@ControllerAdvice
public class GlobalExceptionHandler {

    //处理RuntimeException并返回错误信息 HTTP状态码为500
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public String handleRuntimeException(RuntimeException ex) {
        return "系统错误:"+ex.getMessage();
    }

    //处理自定义异常CustomException并返回错误信息 HTTP状态码为400
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public String handleCustomException(CustomException ex) {
        return "自定义异常:"+ex.getMessage();
    }
}

上述代码演示了如何定义全局异常处理方法。在这个例子中,我们使用了@ControllerAdvice注解来定义一个全局异常处理程序并处理RuntimeException和自定义异常CustomException,并且返回特定的错误文本。

具体实现

通常情况下,我们定义全局异常处理程序的实际过程如下:

  1. 创建异常类并继承RuntimeExceptionException,根据异常实际情况实现自定义的异常信息。
  2. 创建全局异常处理类,通过@ControllerAdvice注解来声明类,并添加@ExceptionHandler注解来指示要处理哪个具体的异常类。
  3. 处理异常时,可以返回一个特定的错误页面或错误信息。

以下是两个具体的实现示例:

第一个示例

假设在我们的应用程序中,我们有一个自定义的ResourceNotFoundException异常,它被用于处理用户请求不存在的资源时抛出。在这种情况下,我们可以创建一个全局异常处理类来处理所有的ResourceNotFoundException异常。代码如下:

自定义异常类

public class ResourceNotFoundException extends RuntimeException {

    private String resourceName;
    private String fieldName;
    private Object fieldValue;

    public ResourceNotFoundException(String resourceName, String fieldName, Object fieldValue) {
        super(String.format("%s not found with %s : '%s'", resourceName, fieldName, fieldValue));
        this.resourceName = resourceName;
        this.fieldName = fieldName;
        this.fieldValue = fieldValue;
    }

    public String getResourceName() {
        return resourceName;
    }

    public String getFieldName() {
        return fieldName;
    }

    public Object getFieldValue() {
        return fieldValue;
    }
}

全局异常处理类

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    protected ResponseEntity<Object> handleResourceNotFound(
            ResourceNotFoundException ex) {
        ExceptionResponse response = new ExceptionResponse(ex.getMessage(), HttpStatus.NOT_FOUND);
        return new ResponseEntity<Object>(response, HttpStatus.NOT_FOUND);
    }
}

ErrorResponse类

public class ExceptionResponse {

    private String message;
    private HttpStatus status;

    public ExceptionResponse(String message, HttpStatus status) {
        super();
        this.message = message;
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public HttpStatus getStatus() {
        return status;
    }

    public void setStatus(HttpStatus status) {
        this.status = status;
    }

}

在这个示例代码中,我们使用了一个@ControllerAdvice注解的类RestExceptionHandler来定义全局异常处理程序,并添加了@ExceptionHandler注解来指示要处理ResourceNotFoundException异常。在异常处理方法中,我们返回了一个ErrorResponse对象,其中包含了我们定义的异常消息和HTTP响应码。

第二个示例

假设我们的应用程序中有一个自定义的CustomException异常,它被用于处理我们自己的业务逻辑异常。在这种情况下,我们可以创建一个全局异常处理类来处理所有的CustomException异常。代码如下:

自定义异常类

public class CustomException extends RuntimeException {

    public CustomException(String message) {
        super(message);
    }

}

全局异常处理类

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ModelAndView handleCustomException(HttpServletRequest request, Exception ex){

        ModelAndView model = new ModelAndView("custom_error");
        model.addObject("exception", ex);
        model.addObject("url", request.getRequestURL());

        return model;
    }
}

在这个示例代码中,我们使用了一个@ControllerAdvice注解的类GlobalExceptionHandler来定义全局异常处理程序,并添加了@ExceptionHandler注解来指示要处理CustomException异常。在处理异常方法中,我们返回一个错误视图和一些附加的数据,例如异常消息和请求URI。

总结

在Spring Boot应用程序中,全局异常处理程序是实现强大和可靠的应用程序的重要组成部分。使用@ControllerAdvice注解,我们可以轻松地开发自己的全局异常处理程序。

在这篇文章中,我们探讨了全局异常处理程序的基本概念,并给出了两个不同的示例。如有疑问或建议,欢迎留言讨论。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入聊一聊springboot项目全局异常处理那些事儿 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • JBuilderX+SQL Server开发hibernate

    JBuilderX+SQL Server开发hibernate攻略 1. 安装JBuilderX JBuilderX是一个商业软件,需要购买授权。购买后可以从官方网站下载对应的安装程序进行安装。 2. 安装SQL Server SQL Server也是一个商业软件,需要购买授权。购买后可以从官方网站下载对应的安装程序进行安装。 3. 创建Hibernate项…

    database 2023年5月21日
    00
  • 史上最全的MySQL备份方法

    下面是对于“史上最全的MySQL备份方法”的详细讲解。 一、为什么需要备份MySQL数据库 MySQL是一种关系型数据库,是很多网站的核心数据存储方式,因此它的安全性和完整性至关重要。如果没有合适的备份措施,一旦数据库遭受到破坏或误删除,将会造成大量重要数据的丢失。 二、备份MySQL数据库的目的 备份MySQL数据库目的在于,将数据库数据储存到其他位置,以…

    database 2023年5月22日
    00
  • 浅谈MySQL如何优雅的做大表删除

    我会根据以下大纲给出”浅谈MySQL如何优雅的做大表删除”的完整攻略。 I. 优化删除操作的SQL语句- 使用DELETE语句时避免使用WHERE子句匹配整个表- 分批删除,使用LIMIT和ORDER BY子句定位需要的行- 考虑对相关表建立索引以提高删除操作速度 II. 使用TRUNCATE操作删除表数据- TRUNCATE比DELETE更快,因为它不记录…

    database 2023年5月19日
    00
  • docker 运行 redis 并指定配置文件

      1、上传配置文件到服务器。目录如下 2、 swt@ubuntu-swt:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3、运行容器 sudo docker run -d -v /home/swt/redis/:/data -p 6379:6379 redis…

    Redis 2023年4月13日
    00
  • Linux下定时切割Tomcat日志并删除指定天数前的日志记录

    针对这个问题,我来为您提供一份完整的攻略。 步骤一:安装logrotate logrotate是Linux下一个非常常用的日志切割工具,它可以定期扫描指定目录下的日志文件,并对其进行备份、压缩、删除等操作。因此,我们首先需要安装logrotate。具体安装方式,可参考如下步骤: # Ubuntu/Debian apt-get update apt-get i…

    database 2023年5月22日
    00
  • Linux系统利用crontab定时备份Mysql数据库方法

    当我们运行一个 Mysql 数据库时,为了避免数据的丢失,在数据库中定时备份是非常必要的。在 Linux 系统中,可以使用 crontab 工具来实现定时备份 Mysql 数据库的功能。以下是具体步骤: 步骤一:安装 mysql-client 和 cron 工具 在 Linux 系统上安装 mysql-client 和 cron 工具,mysql-clien…

    database 2023年5月22日
    00
  • Redis为什么能抗住10万并发?揭秘性能优越的背后原因

    Redis是一个开源的,基于内存的,高性能的键值型数据库。它支持多种数据结构,包含五种基本类型 String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三种特殊类型 Geo(地理位置)、HyperLogLog(基数统计)、Bitmaps(位图),可以满足各种应用场景的需求。 1. Redis简介 Redis是一个开…

    Redis 2023年4月14日
    00
  • asp.net中ADO SQL数据库 笔记汇总 持续更新中

    这里是“asp.net中ADO SQL数据库 笔记汇总 持续更新中”的完整攻略: 一、概述 这篇笔记汇总主要介绍在ASP.NET应用程序中使用ADO.NET访问SQL Server数据库的相关知识。通过本文,你可以学会如下技能: 如何连接SQL Server数据库 如何执行SQL语句 如何读取查询结果 如何使用存储过程 如何使用事务处理等 下面我会详细介绍每…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部