Sprint Boot @ExceptionHandler使用方法详解

@ExceptionHandler是Spring Boot中的一个注解,它用于处理控制器方法中抛出的异常。在使用Spring Boot开发Web应用程序时,@ExceptionHandler是非常重要的。本文将详细介绍@ExceptionHandler的作用和使用方法,并提供两个示例说明。

@ExceptionHandler的作用

@ExceptionHandler的作用是处理控制器方法中抛出的异常。使用@ExceptionHandler注解的方法可以处理控制器方法中抛出的异常,并返回适当的响应。@ExceptionHandler注解可以用于类级别和方法级别,用于指定控制器类和控制器方法的异常处理。

@ExceptionHandler使用方法

以下是使用@ExceptionHandler的步骤:

  1. 创建控制器

要使用@ExceptionHandler,需要创建一个控制器。可以使用以下代码创建一个控制器:

@RestController
@RequestMapping("/users")
public class UserController {

    private List<User> users = new ArrayList<>();

    @PostMapping
    public void addUser(@RequestBody User user) {
        users.add(user);
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable int id) {
        if (id >= users.size()) {
            throw new UserNotFoundException("User not found with id " + id);
        }
        return users.get(id);
    }

}

在上面的代码中,我们使用@RestController注解标记了一个名为UserController的类。我们还使用@RequestMapping注解标记了一个名为/users的路径,该路径将映射到控制器类上。我们还使用@PostMapping注解标记了一个名为addUser的方法,该方法将处理HTTP POST请求,并将用户信息添加到列表中。我们还使用@RequestBody注解标记了一个名为user的参数,该参数是HTTP请求体,用于指定要添加的用户信息。我们还使用@GetMapping注解标记了一个名为getUser的方法,该方法将处理HTTP GET请求,并返回指定ID的用户信息。我们还使用@PathVariable注解标记了一个名为id的参数,该参数是HTTP请求路径变量,用于指定要获取的用户的ID。如果指定的ID不存在,则抛出UserNotFoundException异常。

  1. 创建异常处理器

要使用@ExceptionHandler,需要创建一个异常处理器。可以使用以下代码创建一个异常处理器:

@RestControllerAdvice
public class UserControllerAdvice {

    @ExceptionHandler(UserNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleUserNotFoundException(UserNotFoundException ex) {
        return ex.getMessage();
    }

}

在上面的代码中,我们使用@RestControllerAdvice注解标记了一个名为UserControllerAdvice的类。我们还使用@ExceptionHandler注解标记了一个名为handleUserNotFoundException的方法,该方法将处理UserNotFoundException异常,并返回适当的响应。我们还使用@ResponseStatus注解标记了一个名为HttpStatus.NOT_FOUND的参数,该参数表示HTTP响应状态码为404。如果控制器方法中抛出了UserNotFoundException异常,则将调用handleUserNotFoundException方法,并返回适当的响应。

  1. 运行应用程序

要运行应用程序,只需要使用以下命令:

mvn spring-boot:run

在上面的命令中,我们使用Maven运行了Spring Boot应用程序。

  1. 测试应用程序

要测试应用程序,可以使用curl命令。以下是使用curl命令测试应用程序的步骤:

  • 打开终端
  • 输入curl -X POST http://localhost:8080/users -H 'Content-Type: application/json' -d '{"name": "John", "age": 30}'
  • 按下回车键
  • 输入curl http://localhost:8080/users/0
  • 按下回车键

在上面的步骤中,我们使用curl命令添加了一个名为John、年龄为30的用户信息,并获取了ID为0的用户信息。如果指定的ID不存在,则会返回404响应。

示例1:使用@ExceptionHandler处理自定义异常

以下是使用@ExceptionHandler处理自定义异常的示例:

@RestController
@RequestMapping("/users")
public class UserController {

    private List<User> users = new ArrayList<>();

    @PostMapping
    public void addUser(@RequestBody User user) {
        users.add(user);
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable int id) {
        if (id >= users.size()) {
            throw new UserNotFoundException("User not found with id " + id);
        }
        return users.get(id);
    }

}

在上面的示例中,我们使用@RestController注解标记了一个名为UserController的类。我们还使用@RequestMapping注解标记了一个名为/users的路径,该路径将映射到控制器类上。我们还使用@PostMapping注解标记了一个名为addUser的方法,该方法将处理HTTP POST请求,并将用户信息添加到列表中。我们还使用@RequestBody注解标记了一个名为user的参数,该参数是HTTP请求体,用于指定要添加的用户信息。我们还使用@GetMapping注解标记了一个名为getUser的方法,该方法将处理HTTP GET请求,并返回指定ID的用户信息。我们还使用@PathVariable注解标记了一个名为id的参数,该参数是HTTP请求路径变量,用于指定要获取的用户的ID。如果指定的ID不存在,则抛出UserNotFoundException异常。

@RestControllerAdvice
public class UserControllerAdvice {

    @ExceptionHandler(UserNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleUserNotFoundException(UserNotFoundException ex) {
        return ex.getMessage();
    }

}

在上面的示例中,我们使用@RestControllerAdvice注解标记了一个名为UserControllerAdvice的类。我们还使用@ExceptionHandler注解标记了一个名为handleUserNotFoundException的方法,该方法将处理UserNotFoundException异常,并返回适当的响应。我们还使用@ResponseStatus注解标记了一个名为HttpStatus.NOT_FOUND的参数,该参数表示HTTP响应状态码为404。如果控制器方法中抛出了UserNotFoundException异常,则将调用handleUserNotFoundException方法,并返回适当的响应。

示例2:使用@ExceptionHandler处理全局异常

以下是使用@ExceptionHandler处理全局异常的示例:

@RestController
@RequestMapping("/users")
public class UserController {

    private List<User> users = new ArrayList<>();

    @PostMapping
    public void addUser(@RequestBody User user) {
        if (user.getName() == null || user.getName().isEmpty()) {
            throw new InvalidUserException("User name cannot be empty");
        }
        users.add(user);
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable int id) {
        if (id >= users.size()) {
            throw new UserNotFoundException("User not found with id " + id);
        }
        return users.get(id);
    }

}

在上面的示例中,我们使用@RestController注解标记了一个名为UserController的类。我们还使用@RequestMapping注解标记了一个名为/users的路径,该路径将映射到控制器类上。我们还使用@PostMapping注解标记了一个名为addUser的方法,该方法将处理HTTP POST请求,并将用户信息添加到列表中。我们还使用@RequestBody注解标记了一个名为user的参数,该参数是HTTP请求体,用于指定要添加的用户信息。如果用户姓名为空,则抛出InvalidUserException异常。我们还使用@GetMapping注解标记了一个名为getUser的方法,该方法将处理HTTP GET请求,并返回指定ID的用户信息。我们还使用@PathVariable注解标记了一个名为id的参数,该参数是HTTP请求路径变量,用于指定要获取的用户的ID。如果指定的ID不存在,则抛出UserNotFoundException异常。

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleException(Exception ex) {
        return "An error occurred: " + ex.getMessage();
    }

}

在上面的示例中,我们使用@RestControllerAdvice注解标记了一个名为GlobalExceptionHandler的类。我们还使用@ExceptionHandler注解标记了一个名为handleException的方法,该方法将处理所有异常,并返回适当的响应。我们还使用@ResponseStatus注解标记了一个名为HttpStatus.INTERNAL_SERVER_ERROR的参数,该参数表示HTTP响应状态码为500。如果控制器方法中抛出了任何异常,则将调用handleException方法,并返回适当的响应。

结论

在本文中,我们详细介绍了@ExceptionHandler的作用和使用方法,并提供了两个示例说明。使用@ExceptionHandler可以方便地处理控制器方法中抛出的异常,并返回适当的响应。通过使用@ExceptionHandler,我们可以将开发Web应用程序的时间和精力集中在业务逻辑上,而是处理异常和响应。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Sprint Boot @ExceptionHandler使用方法详解 - Python技术站

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

相关文章

  • 详解java设计模式之六大原则

    详解Java设计模式之六大原则 在软件开发中,设计模式是一种解决特定问题的经验总结,它提供了一种通用的设计思路,可以使我们在编码时更加高效和准确地解决问题。Java设计模式是指在Java程序开发中应用的一种设计方式,它有六大原则,分别是: 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特原则 开闭原则 本文将详细讲解这六大原则。 单一职责原则 …

    Java 2023年5月26日
    00
  • Tomcat 多站点配置详解及实现方法

    下面是关于 “Tomcat 多站点配置详解及实现方法” 的完整攻略,包含以下内容: 一、前提条件 在进行 Tomcat 多站点配置前,需要提前了解以下几个知识点: Tomcat 的部署方式 基本的 Tomcat 目录结构 虚拟主机的概念 DNS 解析的原理和流程 二、基本步骤 Tomcat 多站点配置的基本流程如下: 创建虚拟主机配置 在 Tomcat 的 …

    Java 2023年5月19日
    00
  • 6000+字讲透ElasticSearch 索引设计

    ElasticSearch 索引设计 在MySQL中数据库设计非常重要,同样在ES中数据库设计也是非常重要的 概述 我们创建索引就像创建表结构一样,必须非常慎重的,索引如果创建不好后面会出现各种各样的问题 索引设计的重要性 索引创建后,索引的分片只能通过_split和_shrink接口对其进行成倍的增加和缩减 主要是因为es的数据是通过_routing分配到…

    Java 2023年5月11日
    00
  • Java面向对象之抽象类,接口的那些事

    Java面向对象之抽象类与接口 什么是抽象类? 抽象类是一种特殊的类,它不能被实例化,只能被继承。 定义抽象类 抽象类的定义方式为,在class前加上abstract关键字。 下面是一个定义抽象类的示例代码: abstract class Animal { public abstract void move(); } 其中,Animal是一个抽象类,而mov…

    Java 2023年5月26日
    00
  • maven项目打jar包并包含所有依赖详细教程

    下面为你详细讲解如何利用Maven项目打包成Jar并包含所有依赖的详细教程。 一、前提条件 在进行下面的操作前,请确保你的开发环境中已经安装了Maven,并且已经正确配置了Maven的环境变量。 二、maven打包命令 在Maven项目的根目录下运行以下命令: mvn clean package 此命令将在target目录下生成一个Jar包文件。当然,也可以…

    Java 2023年6月2日
    00
  • java简介及环境搭建

    Java简介及环境搭建 Java简介 Java是一种面向对象的编程语言,由Sun Microsystems公司于1995年推出。Java语言具有跨平台性和开发效率高等特点,成为了一种非常流行的编程语言。 Java环境搭建 为了学习和开发Java程序,我们需要先搭建Java环境。 安装Java开发工具包(JDK) 首先,我们需要下载并安装Java开发工具包(J…

    Java 2023年5月19日
    00
  • java多线程实现取款小程序

    下面是针对Java多线程实现取款小程序的完整攻略。 准备工作 在开始之前,我们需要先了解一些Java多线程方面的基础知识,如线程创建与启动、线程同步、线程通信等。这些知识我们可以通过阅读相关的书籍或者在线教程来学习掌握。 实现步骤 创建一个银行账户类,包括账户余额、账户号码等属性,以及存、取款等方法。 public class Account { priva…

    Java 2023年5月18日
    00
  • Java开发中为什么要使用单例模式详解

    单例模式是一种创建型设计模式,用于确保一个特定类只能有一个实例,并且提供全局访问点。在Java开发中,单例模式是一个常用的设计模式,因为它可以帮助我们管理应用程序中的全局状态,减少内存使用,并提高代码的可测试性。 下面是Java开发中为什么要使用单例模式的详细攻略: 1. 避免对象的重复创建 在应用程序中,某些对象只需要一个实例,如果每次需要使用该对象时都创…

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