Sprint Boot @ExceptionHandler使用方法详解

yizhihongxing

@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日

相关文章

  • Mybatis如何通过接口实现sql执行原理解析

    Mybatis是一款使用Java对象与数据库之间的映射配置来处理原始SQL的轻量级ORM框架。它可以通过接口实现 SQL 执行原理,实现原理如下: 在Mybatis中,每个mapper接口都对应了一个mapper xml文件。在mapper xml文件中涵盖了众多的SQL语句。 当应用程序访问mapper接口中的方法时,Mybatis会根据方法名去查询map…

    Java 2023年5月20日
    00
  • Java即将引入新对象类型来解决内存使用问题

    Java即将引入新对象类型来解决内存使用问题指的是Java编程语言即将引入一种叫做Value-based Classes(VBC)的新型对象类型,该对象类型可以在Java应用中有效的降低内存使用量。 VBC是一种基于值类型(value-type)的对象类型。与Java中的传统对象类型不同,传统的Java对象类型是基于引用类型(reference-type)而…

    Java 2023年5月26日
    00
  • Maven打包跳过测试的5种方式总结

    下面我将详细讲解“Maven打包跳过测试的5种方式总结”的完整攻略。 1. 前言 在开发中,经常需要使用 Maven 进行项目构建,在进行打包时,可能需要跳过测试,以加快构建速度,本文总结了 5 种 Maven 打包跳过测试的方式。 2. Maven 的默认行为 对于 Maven 而言,在执行项目构建时,默认情况下会进行测试,如果测试不通过,则会导致项目构建…

    Java 2023年5月19日
    00
  • SpringBoot actuator 健康检查不通过的解决方案

    本次将详细讲解SpringBoot Actuator健康检查无法通过的解决方案。 什么是SpringBoot Actuator 健康检查? SpringBoot中的Actuator是一个管理和监控SpringBoot应用程序的工具集合。Actuator主要是提供了一组RESTful API,让我们可以对应用程序进行配置、管理与监控。 SpringBoot提供…

    Java 2023年5月19日
    00
  • java实现dijkstra最短路径寻路算法

    下面是Java实现Dijkstra最短路径寻路算法的完整攻略: 什么是Dijkstra最短路径寻路算法 Dijkstra算法是一种可以求解带权重图(有向或无向)中的最短路径的算法。该算法要求图的权重为非负值。 Dijkstra算法实现思路 首先我们需要初始化:所有点的到起点的距离为无穷大,但起点到自己的距离为0。 然后从起点开始,将起点标记为已访问过,并将其…

    Java 2023年5月19日
    00
  • JAVA如何调用wsdl过程详解

    在JAVA中调用WSDL过程需要使用SOAP协议,以实现在网络间的交互。 以下是JAVA调用WSDL过程的详细攻略: 1. 导入WSDL文件 首先需要导入WSDL文件,可以使用JAVA的wsimport工具实现自动生成JAVA代码。在命令行中进入wsimport所在文件夹,输入以下命令: wsimport <WSDL地址> 实际执行时,可以将替换…

    Java 2023年5月26日
    00
  • 解决Tomcat启动失败:严重 [main] org.apache.catalina.util.LifecycleBase.handleSubClassException 初始化组件失败

    当Tomcat服务器启动的时候,有时候会遇到如下错误提示信息: 严重 [main] org.apache.catalina.util.LifecycleBase.handleSubClassException 初始化组件失败 这种错误一般是由于Tomcat启动出现了问题而引起的,可能是配置出错、依赖缺失、文件权限问题等,接下来我将详细讲解如何解决这种问题。以…

    Java 2023年6月2日
    00
  • springboot打包如何忽略Test单元测试

    使用Maven插件 首先在pom.xml中使用Maven插件,添加如下代码段,其中,true表示不执行单元测试: <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spri…

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