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日

相关文章

  • 使用maven工具解决jar包冲突或重复加载的问题

    使用 Maven 工具可以有效地解决 Java 项目中 Jar 包冲突或者重复加载的问题。接下来,我会详细讲解如何使用 Maven 工具来解决这个问题的完整攻略。 1. Maven依赖冲突的解决 Maven 场景中,当我们引用的多个 Jar 包中存在重复的类或者接口时,会出现冲突。这种冲突情况下,只有部分功能可以使用,或者无法正常使用。 为了解决这个问题,我…

    Java 2023年5月19日
    00
  • application作用域实现用户登录挤掉之前登录用户代码

    首先我们需要明确一下“application作用域”和“用户登录挤掉之前登录用户”的概念。 “application作用域”:指整个web应用程序都能够访问的作用域,存储的数据是全局共享的,任何用户访问该应用程序都可以访问这些数据。可以通过以下代码获取application作用域对象: ServletContext application = request…

    Java 2023年5月20日
    00
  • Java实现的简单网页截屏功能示例

    关于如何实现Java实现的简单网页截屏功能的攻略,我可以提供以下详细步骤: 准备工作 安装Java环境以及Java相关IDE,如Eclipse等。 安装Selenium Webdriver相关的浏览器驱动文件,如ChromeDriver等。 实现步骤 导入相关的jar包,如selenium-java等,并创建一个Java项目。 在项目中导入Selenium的…

    Java 2023年5月18日
    00
  • jsp自定义标签技术(实现原理与代码以及平台搭建步骤)

    自定义标签是 JSP 中的高级概念之一,它允许我们定义自己的 JSP 标签。使用这种技术,我们可以将一些特定的代码逻辑和操作封装在标签中,从而方便地在 JSP 页面中重复使用。自定义标签可以极大地提高 Web 应用程序的可维护性和可扩展性。 实现原理 自定义标签的实现原理是基于 Java Servlet 和 Java Bean 技术的。我们可以使用 Java…

    Java 2023年6月15日
    00
  • 用jsp页面生成随机的验证数字码示例

    下面我将详细讲解使用JSP页面生成随机验证数字码的完整攻略。 首先,我们可以使用Java的Random类生成随机数。为了方便,我们也可以借助第三方库,如Apache Commons Lang库中的RandomStringUtils类。 示例1: 使用Java原生API代码实现: <% int length = 6; // 设置验证码的长度 Random…

    Java 2023年6月15日
    00
  • Java策略模式的简单应用实现方法

    接下来我会详细讲解“Java策略模式的简单应用实现方法”的完整攻略。 什么是策略模式? 策略模式是一种行为型设计模式,它允许你定义一组算法,将每个算法都封装起来,并使它们之间可以互换。该模式让算法的变化独立于使用它们的客户端,即可以在不修改客户端代码的情况下更换执行算法。 策略模式的应用场景 当需要在不同情况下使用不同的算法时,可以使用策略模式,将每种算法都…

    Java 2023年5月26日
    00
  • JSP常用七大动作指令实例解析

    下面我来为您介绍“JSP常用七大动作指令实例解析”的完整攻略。 什么是JSP动作指令 JSP动作指令是一种特殊的标记,用于在JSP页面中指定特定的处理操作。每个指令都有一个特定的功能,并且在JSP页面的不同部分中使用。JSP标准标签库(JSTL)和自定义标签库都是由JSP动作指令实现的。 JSP常用七大动作指令 1. <%@ page %>指令 …

    Java 2023年6月15日
    00
  • JavaWeb实战之用Servlet+JDBC实现用户登录与注册

    下面是此攻略的详细讲解。 1. 背景 JavaWeb是一种在Web应用程序开发领域广泛使用的技术,可以帮助Web开发人员构建高效,可靠,安全的Web应用程序。其中,Servlet和JDBC是JavaWeb开发的两个核心组件。通过使用Servlet和JDBC,我们可以实现许多常见的Web应用程序,例如用户登录和注册,数据管理,用户反馈等功能。 此文我们将来讲解…

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