深入聊一聊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日

相关文章

  • Azkaban3.81.x部署过程及遇到的坑

    Azkaban 3.81.x部署过程及遇到的坑 简介 Azkaban是一个开源的批处理任务调度器,由LinkedIn公司开发。它提供了一个易于使用的Web用户界面来管理和调度Hadoop作业。 安装 安装Java 在运行Azkaban之前,必须安装Java。可以在Oracle网站上下载并安装Java SE Development Kit (JDK)。 下载A…

    database 2023年5月22日
    00
  • SQL 按照时间单位分组

    首先需要明确一下什么是按照时间单位分组。在SQL中,我们可以使用DATE_TRUNC函数将一个时间列按照指定的时间单位(如年、月、日、小时等)截取,并对这个时间单位进行分组和聚合计算。下面将介绍如何在SQL中使用DATE_TRUNC函数进行时间分组操作。 使用DATE_TRUNC函数进行时间分组 DATE_TRUNC函数的语法如下: DATE_TRUNC(‘…

    database 2023年3月27日
    00
  • python操作mysql数据库

    在我们做自动化测试工作中,肯定会用到查询数据库验证数据库的操作; 本篇主要写的就是封装好的针对数据库的基本操作,如果工作中遇到造数据也可以直接调用; 代码: # project :Python_Script # -*- coding = UTF-8 -*- # Autohr :XingHeYang # File :operation_mysql_databa…

    MySQL 2023年4月13日
    00
  • MySQL 8.0新特性 — 管理端口的使用简介

    MySQL 8.0新特性 — 管理端口的使用简介 MySQL 8.0引入了一些新特性,其中一个是管理端口(Management Port)。管理端口是用于与MySQL服务器实例进行管理通信的端口。在此文章中,我们将讨论如何使用管理端口。 启用管理端口 如果要使用管理端口,需要在MySQL服务器实例中启用它。可以使用以下命令来启用管理端口: mysqlsh-j…

    database 2023年5月22日
    00
  • MongoDB固定集合使用方法详解(详细步骤)

    什么是MongoDB固定集合? MongoDB固定集合是一种特殊的集合,它的大小是固定的,当达到限定大小时,它会覆盖旧的数据。这样可以很好的控制数据的大小,避免数据过度增长引起服务器的瓶颈和性能问题。 创建MongoDB固定集合 要创建MongoDB固定集合,需要在创建集合时指定集合的大小及存储引擎。可以使用以下代码创建MongoDB固定集合: db.cre…

    MongoDB 2023年3月14日
    00
  • 解决Redis启动警告问题

    下面为您详细讲解“解决Redis启动警告问题”的完整攻略。 问题描述 在启动 Redis 的过程中,可能会出现警告信息,如下所示: 32455:M 31 May 08:24:16.378 * Increased maximum number of open files to 10032 (it was originally set to 1024). 该警告…

    database 2023年5月22日
    00
  • IDEA连接mysql数据库报错的解决方法

    下面是详细讲解“IDEA连接MySQL数据库报错的解决方法”的完整攻略。 问题描述 在使用 IntelliJ IDEA 连接 MySQL 数据库时,可能会遭遇连接报错问题,如下所示: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The la…

    database 2023年5月18日
    00
  • CentOS8下MySQL 8.0安装部署的方法

    以下是CentOS 8下MySQL 8.0安装部署的方法: 准备工作 在安装MySQL之前,需要先安装依赖包和更新系统 sudo yum install -y wget net-tools vim sudo yum update -y 下载MySQL安装包 MySQL官方提供了RPM包安装方式,可以先去官网下载对应版本的rpm包:https://dev.my…

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