SpringBoot全局异常处理方式

当我们使用SpringBoot开发应用程序时,难免会遇到各种异常,在没有对异常进行处理时,用户会得到一些看不懂或不能理解的提示信息,这对于用户来说是非常不友好的,所以我们需要设置全局异常处理方式来帮助用户更好地理解我们的应用程序。

以下是关于SpringBoot全局异常处理的完整攻略,包括两个示例:

1. 全局异常处理方式

在SpringBoot中,我们可以通过实现@ControllerAdvice注解的ExceptionHandler方法来设置全局异常处理方式,如下所示:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String handleException(Exception ex, HttpServletRequest req) {
        // 判断是否为AJAX请求
        if (isAjaxRequest(req)) {
            // 处理AJAX请求异常
            return handleAjaxException(ex);
        } else {
            // 处理普通请求异常
            return handleNormalException(ex);
        }
    }

    // 判断是否为AJAX请求
    private boolean isAjaxRequest(HttpServletRequest req) {
        return "XMLHttpRequest".equals(req.getHeader("X-Requested-With"));
    }

    // 处理AJAX请求异常
    private String handleAjaxException(Exception ex) {
        // 处理异常信息
        return "ajax_error";
    }

    // 处理普通请求异常
    private String handleNormalException(Exception ex) {
        // 处理异常信息
        return "error";
    }
}

在上面的代码中,我们首先定义了一个GlobalExceptionHandler类,并使用@ControllerAdvice注解来标记它是一个全局异常处理类。然后,我们使用@ExceptionHandler(Exception.class)注解来标记当程序发生未知异常时,使用handleException方法来处理异常。

handleException方法中,我们首先判断请求是否为AJAX请求,如果是,则调用handleAjaxException方法来处理。如果不是,则调用handleNormalException方法来处理。

handleAjaxException方法中,我们返回一个字符串ajax_error,其实这里可以返回一个JSON对象,以便传递更多的异常信息给前端。

handleNormalException方法中,我们返回一个字符串error,表示出现异常时跳转到一个错误页面。

2. 全局异常处理示例

下面是一个SpringBoot应用程序中的全局异常处理示例。

2.1 异常处理类

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest req) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("exception", ex);
        mv.setViewName("error");
        return mv;
    }
}

在上面的代码中,我们定义了一个GlobalExceptionHandler类,并使用@ControllerAdvice注解来标记它是一个全局异常处理类。然后,我们使用@ExceptionHandler(Exception.class)注解来标记当程序发生未知异常时,使用handleException方法来处理异常。

handleException方法中,我们首先创建一个ModelAndView对象,并将异常信息添加到该对象中。然后,我们将该对象的viewName设置为error,表示出现异常时跳转到一个错误页面。

2.2 控制器类

@RestController
public class UserController {

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Integer id) {
        if (id == 1) {
            throw new RuntimeException("查询失败");
        }
        User user = new User();
        user.setId(id);
        user.setName("Tom");
        user.setAge(20);
        return user;
    }
}

在上面的代码中,我们定义了一个UserController类,并使用@RestController注解来标记它是一个控制器类。然后,我们定义了一个getUser方法,用于查询用户信息。

getUser方法中,如果查询的用户ID为1,则抛出一个运行时异常,表示查询失败。

2.3 错误页面

在SpringBoot中,我们可以在static目录下添加一个error.html文件来作为错误页面,如下所示:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>出错了</title>
</head>
<body>
    <h1>出错了</h1>
    <p>错误信息:${exception.message }</p>
</body>
</html>

在上面的代码中,我们首先定义了一个error.html页面,并使用${exception.message}来输出异常信息。

2.4 测试结果

在浏览器中访问http://localhost:8080/user/1,我们会得到以下错误信息:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Mon Jul 05 15:52:17 CST 2021
There was an unexpected error (type=Internal Server Error, status=500).
查询失败

说明程序发生了运行时异常,并且没有显示出我们自定义的错误页面。

下面我们打开浏览器的开发者工具(按F12),选择Network选项卡自己再输入地址测试,查看响应内容,我们会发现返回了以下JSON结构:

{
    "timestamp": "2021-07-05T08:51:15.650+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "message": "查询失败",
    "path": "/user/1"
}

这就是我们设置全局异常处理方式后返回的JSON对象,其中message字段中包含了异常信息。但是,我们期望的是跳转到我们自己定义的错误页面,所以我们需要调整GlobalExceptionHandler类中的handleException方法。

2.5 修改异常处理类

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest req) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("exception", ex);

        // 判断是否为AJAX请求
        if ("XMLHttpRequest".equals(req.getHeader("X-Requested-With"))) {
            // AJAX请求异常
            mv.setViewName("ajax_error");
        } else {
            // 普通请求异常
            mv.setViewName("error");
        }
        return mv;
    }
}

在上面的代码中,我们现在将错误信息包装成ModelAndView返回,并根据请求的类型判断是返回错误页面还是返回JSON对象。如果是AJAX请求,则返回ajax_error.html页面,否则返回error.html页面。

2.6 创建AJAX异常处理页面

我们将在static目录下创建一个ajax_error.html文件,用于输出异常信息,在该文件中定义了以下内容:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>AJAX出错了</title>
</head>
<body>
    <h1>AJAX出错了</h1>
    <p>错误信息:${exception.message }</p>
</body>
</html>

在上面的代码中,我们首先定义了一个ajax_error.html页面,并使用${exception.message}来输出异常信息。

2.7 测试结果

在浏览器中访问http://localhost:8080/user/1,我们现在会得到以下错误信息:

AJAX出错了
错误信息:查询失败

这就是我们自定义的错误页面显示的错误信息。

如果我们使用Postman等工具进行测试,我们可以得到以下JSON响应:

{
    "exception": "java.lang.RuntimeException",
    "message": "查询失败",
    "path": "/user/1"
}

这就是我们设置全局异常处理方式后返回的JSON对象,其中message字段中包含了异常信息。

阅读剩余 77%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot全局异常处理方式 - Python技术站

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

相关文章

  • Java之Maven工程打包jar

    下面是讲解如何使用Maven对Java工程进行打包生成jar文件的攻略: 准备工作 安装Java 下载并安装Maven 创建一个Maven工程 打包jar文件步骤 在Maven工程的根目录下,打开命令行窗口,执行 mvn package 命令,Maven会自动进行编译和打包jar文件。 执行成功后,在Maven工程的 target 目录下,就可以看到一个以 …

    Java 2023年5月20日
    00
  • SpringBoot配置项目访问路径URL的根路径方式

    在Spring Boot应用程序中,我们可以使用配置文件或注解的方式来配置项目访问路径URL的根路径。本文将详细介绍如何使用这两种方式来配置项目访问路径URL的根路径,并提供两个示例说明。 1. 使用配置文件配置项目访问路径URL的根路径 在Spring Boot应用程序中,我们可以使用application.properties或application.y…

    Java 2023年5月18日
    00
  • Java实现简单版贪吃蛇游戏

    Java实现简单版贪吃蛇游戏 简介 贪吃蛇是一款经典的游戏,通过控制蛇的移动方向和吃到食物来增加蛇的长度,直到蛇撞到墙壁或自己的身体,游戏结束。本文将介绍如何使用Java语言实现一个简单版的贪吃蛇游戏。 实现步骤 1. 设计游戏界面 游戏界面包括游戏画布、分数显示和游戏控制按钮等组件。可以使用Java Swing库来实现游戏界面的设计。 2. 实现蛇的移动 …

    Java 2023年5月26日
    00
  • Java实现字符串匹配(基于正则)

    Java实现字符串匹配最常用的方式就是基于正则表达式,这种方式可以基于一些简单的字符模式来匹配或查找字符串中的子串,非常方便实用。下面是Java实现字符串匹配(基于正则)的完整攻略: 步骤1: 导入正则表达式包 在Java中,我们需要import java.util.regex.*来导入正则表达式相关的包。 import java.util.regex.*;…

    Java 2023年5月26日
    00
  • Java如何获取字符串单词个数

    要获取一个字符串中的单词个数,可以使用Java的正则表达式和字符串操作。 具体步骤如下: 将字符串按照空格或标点符号进行分割,得到字符串数组(即每个元素为一个单词)。 统计字符串数组的长度,即为单词的个数。 下面是代码实现: public static int getWordCount(String str) { if (str == null || str…

    Java 2023年5月27日
    00
  • Java Mybatis批量修改封装详解

    Java Mybatis批量修改封装详解 批量修改是指批量对数据库表中的记录进行更新操作。在Java Mybatis框架中,我们可以使用批量更新语句来实现批量修改。但是,在实际开发中,我们往往需要对批量更新进行封装,以便更好地复用和维护。本篇文章将介绍如何对Java Mybatis批量修改进行封装,帮助读者更好地理解和应用相关技术。 1. 批量修改的基本思路…

    Java 2023年5月20日
    00
  • 如何突破PHP程序员的技术瓶颈分析

    如何突破PHP程序员的技术瓶颈分析 1. 确定技术瓶颈 首先,我们需要确定技术瓶颈是什么。通常来说,技术瓶颈可能来自以下几个方面: 编程能力 网络编程能力 数据库设计能力 项目经验 针对不同的问题,我们需要采取不同的解决方案。一般来说,我们可以通过下面的方式来做一些自我评估: 性能分析:使用工具,比如xhprof,Blackfire等,对PHP应用的性能进行…

    Java 2023年6月15日
    00
  • MVC框架自定义实现过程

    MVC框架自定义实现过程 MVC 框架是一种常用的设计模式,它将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。MVC 框架可以帮助我们更好地组织代码,提高代码的可维护性和可扩展性。本文将详细讲解 MVC 框架自定义实现过程,包括 MVC 框架的架构、MVC 框架的实现、MVC 框架的示例等。 MVC 框架的架构 …

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