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中,枚举类型定义时需要使用enum关键字,基本语法如下: enum 枚举名称 { 枚举常量1, 枚举常量2, … 枚举常量n } 其中,枚举…

    Java 2023年5月26日
    00
  • Java实现文件及文件夹的删除

    当需要删除一个文件或文件夹时,我们可以使用Java中的File类的delete()方法来完成。本文将详细讲解Java实现文件及文件夹的删除的完整攻略。 删除文件 删除文件的过程非常简单,只需要创建一个File对象,然后调用delete()方法即可。 示例代码: File file = new File("path/to/file"); i…

    Java 2023年5月19日
    00
  • java中String,数组,ArrayList三者之间的转换

    对于Java中的String、数组和ArrayList,它们之间的转换是非常常见和实用的操作。下面我将为您提供一份完整攻略: 1. String转数组 将一个字符串转换成字符数组非常简单,只需要使用 String 类的 toCharArray() 方法即可。例如: String str = "Hello, world!"; char[] …

    Java 2023年5月26日
    00
  • 最终幻想14白魔学者常用宏大全

    最终幻想14(Final Fantasy XIV)是一个非常经典的MMORPG游戏,其中白魔学者是非常重要的职业之一。使用宏可以大大增强玩家的游戏体验和提高游戏效率。在本篇攻略中,我们将介绍一些白魔学者常用的宏。 宏的概念及使用方法 宏是一种由玩家自定义的命令组合。玩家可以将多个命令组合成一个宏,并通过一个按键或鼠标点击来执行这个宏。使用宏可以让玩家快速执行…

    Java 2023年6月15日
    00
  • spring解决循环依赖

    Spring可以通过循环依赖机制解决Java类之间的循环依赖问题,使得依赖关系的链条能够正确地建立和管理。这是因为Spring在创建Bean时采用了延迟依赖注入的方式,先创建不带依赖的Bean对象,再通过setter方法或者构造函数注入其所依赖的其他Bean对象,实现了依赖对象的动态注入。 下面是具体的解决循环依赖的攻略: 构造函数注入 一个Bean依赖于另…

    Java 2023年5月31日
    00
  • 【深度思考】聊聊JDK动态代理原理

    1. 示例 首先,定义一个接口: public interface Staff { void work(); } 然后,新增一个类并实现上面的接口: public class Coder implements Staff { @Override public void work() { System.out.println(“认真写bug……”); } } …

    Java 2023年4月17日
    00
  • 简单的一次springMVC路由跳转实现

    下面我将为您详细介绍“简单的一次spring MVC路由跳转实现”的完整攻略。这个过程需要涵盖以下几个方面: 配置web.xml文件 在web.xml文件中配置DispatcherServlet,它是Spring MVC的核心组件,可以将请求分派到相应的控制器中。示例代码: <servlet> <servlet-name>dispat…

    Java 2023年5月16日
    00
  • Java编程实现对十六进制字符串异或运算代码示例

    下面是详细讲解Java编程实现对十六进制字符串异或运算的完整攻略。 异或运算简介 异或运算(^)是计算机中的一种二进制位运算,它的运算规则是按位进行比较,相同位上的数字相同时,结果为0,不同时,结果为1。例如,10 ^ 6 = 12,是因为10的二进制形式为1010,6的二进制形式为0110,按位进行异或运算后,得到的结果为1100,其十进制形式为12。 十…

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