当前位置:首页 > 机动车 >

springboot全局异常处理(spring boot异常处理流程)

来源:原点资讯(m.360kss.com)时间:2023-11-09 18:37:04作者:YD166手机阅读>>

springboot全局异常处理,spring boot异常处理流程(1)

Spring Boot提供了一种简单且灵活的方式来处理应用程序中的异常,即全局异常处理。全局异常处理允许我们定义一个统一的异常处理器,以捕获应用程序中发生的所有异常,并提供自定义的错误响应。

在本文中,我将详细介绍Spring Boot全局异常处理的方法,并提供源代码和相关说明。

1. 创建全局异常处理器

首先,我们需要创建一个全局异常处理器。我们可以通过实现ErrorController接口或使用@ControllerAdvice注解来创建全局异常处理器。

1.1 实现ErrorController接口

我们可以创建一个类,实现ErrorController接口,并重写getErrorPath()和errorHandle()方法来处理异常。

import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.web.bind.annotation.requestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GlobalErrorController implements ErrorController { private static final String PATH = "/error"; @RequestMapping(value = PATH) public String errorHandle() { // 处理异常逻辑 return "Error handling logic goes here"; } @Override public String getErrorPath() { return PATH; } }

在上面的代码中,我们创建了一个名为GlobalErrorController的类,它实现了ErrorController接口。我们使用@RestController注解将该类标记为一个控制器,并使用@RequestMapping注解来映射处理异常的路径为/error。在errorHandle()方法中,我们可以编写自定义的异常处理逻辑。

1.2 使用@ControllerAdvice注解

另一种创建全局异常处理器的方法是使用@ControllerAdvice注解。我们可以创建一个带有@ControllerAdvice注解的类,并在其中定义一个或多个带有@ExceptionHandler注解的方法来处理异常。

import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) @ResponseBody public String handleException(Exception e) { // 处理异常逻辑 return "Error handling logic goes here"; } }

在上面的代码中,我们创建了一个名为GlobalExceptionHandler的类,并使用@ControllerAdvice注解将其标记为全局异常处理器。我们使用@ExceptionHandler注解来指定要处理的异常类型,并在方法中编写自定义的异常处理逻辑。

2. 配置全局异常处理器

接下来,我们需要将全局异常处理器配置到Spring Boot应用程序中。我们可以通过创建一个配置类,并使用@EnableWebMvc注解或实现WebMvcConfigurer接口来配置全局异常处理器。

2.1 使用@EnableWebMvc注解

我们可以创建一个配置类,并使用@EnableWebMvc注解来启用全局异常处理器。

import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @Configuration @EnableWebMvc public class WebConfig { }

在上面的代码中,我们创建了一个名为WebConfig的配置类,并使用@EnableWebMvc注解来启用全局异常处理器。

2.2 实现WebMvcConfigurer接口

另一种配置全局异常处理器的方法是创建一个配置类,并实现WebMvcConfigurer接口。

import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { resolvers.add(new GlobalExceptionHandler()); } }

在上面的代码中,我们创建了一个名为WebConfig的配置类,并实现了WebMvcConfigurer接口。我们重写了configureHandlerExceptionResolvers()方法,并将全局异常处理器添加到异常解析器列表中。

3. 自定义异常处理逻辑

在全局异常处理器中,我们可以编写自定义的异常处理逻辑。以下是一些常见的处理逻辑示例:

3.1 返回自定义错误信息

import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { String errorMessage = "An error occurred: " e.getMessage(); return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR); } }

在上面的代码中,我们使用@RestControllerAdvice注解将GlobalExceptionHandler类标记为全局异常处理器。在handleException()方法中,我们可以捕获所有的Exception异常,并返回一个包含自定义错误信息的ResponseEntity对象。

3.2 返回自定义错误对象

import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception e) { ErrorResponse errorResponse = new ErrorResponse("An error occurred", e.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } }

在上面的代码中,我们创建了一个名为ErrorResponse的自定义错误对象,并在handleException()方法中返回该对象。该对象包含了自定义的错误信息和异常消息。

3.3 返回统一的错误格式

import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception e) { ErrorResponse errorResponse = new ErrorResponse("An error occurred", e.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException e) { ErrorResponse errorResponse = new ErrorResponse("User not found", e.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND); } }

在上面的代码中,我们创建了一个名为ErrorResponse的自定义错误对象,并在handleException()方法中返回该对象。在handleUserNotFoundException()方法中,我们捕获了UserNotFoundException异常,并返回一个包含自定义错误信息的ResponseEntity对象。

4. 异常处理器的优先级

在Spring Boot应用程序中,可以存在多个全局异常处理器。当发生异常时,Spring Boot会根据异常处理器的优先级来选择合适的处理器。

默认情况下,Spring Boot使用@ControllerAdvice注解的处理器的优先级更高。如果多个处理器都能处理同一类型的异常,Spring Boot将选择具有最高优先级的处理器。

我们可以使用@Order注解来指定处理器的优先级。优先级值越小,优先级越高。

import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice @Order(1) public class GlobalExceptionHandler1 { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { String errorMessage = "An error occurred: " e.getMessage(); return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR); } } @RestControllerAdvice @Order(2) public class GlobalExceptionHandler2 { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { String errorMessage = "An error occurred: " e.getMessage(); return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR); } }

在上面的代码中,GlobalExceptionHandler1的优先级为1,GlobalExceptionHandler2的优先级为2。当发生异常时,GlobalExceptionHandler1将被选择为处理器。

5. 测试全局异常处理器

最后,我们可以编写一些测试用例来测试全局异常处理器。

import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; @SpringBootTest @AutoConfigureMockMvc public class GlobalExceptionHandlerTest { @Autowired private MockMvc mockMvc; @Test public void testHandleException() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/error")) .andExpect(MockMvcResultMatchers.status().isInternalServerError()) .andExpect(MockMvcResultMatchers.content().string("An error occurred: Internal Server Error")); } @Test public void testHandleUserNotFoundException() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/user/123")) .andExpect(MockMvcResultMatchers.status().isNotFound()) .andExpect(MockMvcResultMatchers.content().string("User not found: 123")); } }

在上面的代码中,我们使用MockMvc来模拟HTTP请求,并使用MockMvcRequestBuilders构建请求。在testHandleException()方法中,我们发送一个GET请求到/error路径,并断言返回的状态码为500,内容为"An error occurred: Internal Server Error"。在testHandleUserNotFoundException()方法中,我们发送一个GET请求到/user/123路径,并断言返回的状态码为404,内容为"User not found: 123"。

这些测试用例可以确保全局异常处理器按预期工作,并返回正确的错误信息。

栏目热文

springboot启动过程(springboot是什么)

springboot启动过程(springboot是什么)

现在Java的项目开发中,几乎都会引入Spring框架,甚至有人说java开发现在就是在面向Spring编程。基于Spr...

2023-11-09 19:11:51查看全文 >>

springboot的四大核心(springboot的启动流程)

springboot的四大核心(springboot的启动流程)

前言先透露一下,四大组件分别是:starter, autoconfigure, CLI 以及actuator。下面我们就...

2023-11-09 18:43:50查看全文 >>

主板电池拔掉后进不去系统了(主板电池没电能开机无法进入系统)

主板电池拔掉后进不去系统了(主板电池没电能开机无法进入系统)

“昨天公司遭遇突然的停电,导致无法继续工作,只得提前下班回家。今天回到办公室,电脑却陷入了启动问题。我试图多次重启,希望...

2023-11-09 18:37:10查看全文 >>

换了主板电池后无法进入系统

换了主板电池后无法进入系统

聊聊技嘉B460M DS3H V2主板返厂维修后进不了系统及无盘win7的处理过程技嘉B460M DS3H V2需要处理...

2023-11-09 19:03:52查看全文 >>

主板拔了电池后进不了系统了(电脑放了一年开不了机)

主板拔了电池后进不了系统了(电脑放了一年开不了机)

笔记本内存条DDR3-PC3L(L代表低电压的意思)台式机三代内存条,几代可以看标签或卡口位置现在使用电脑的朋友多了,以...

2023-11-09 18:57:57查看全文 >>

springboot项目实战视频(spring项目实例)

springboot项目实战视频(spring项目实例)

Spring Boot 3是一个非常令人期待的版本,将进一步扩大Spring Boot框架在应用程序开发领域的影响力,并...

2023-11-09 18:58:14查看全文 >>

springboot优缺点(springboot可以开发安卓吗)

springboot优缺点(springboot可以开发安卓吗)

SpringBoot核心功能2.1、独立运行Spring项目Spring boot 可以以jar包形式独立运行,运行一个...

2023-11-09 19:10:21查看全文 >>

springboot启动过程图解(SpringBoot启动流程)

springboot启动过程图解(SpringBoot启动流程)

springboot启动过程中会用到事件发布机制。这里先事件发布说明一下。Spring中的事件发布机制。网上有一篇文章介...

2023-11-09 18:32:06查看全文 >>

springboot图解(springboot视频播放接口)

springboot图解(springboot视频播放接口)

万物皆可Hello World在一个程序员的眼里,万物皆可Hello World。Spring Boot当然也不例外。下...

2023-11-09 18:54:04查看全文 >>

springboot多数据源(springboot 自动添加数据)

springboot多数据源(springboot 自动添加数据)

通过springboot druid mybatisplus使用注解整合第一步:引入相关的依赖jar,如下:<de...

2023-11-09 18:44:46查看全文 >>

文档排行