基于SpringCloud封装统一的异常处理

简介: 在 Spring Cloud 中,可以通过自定义异常处理器来封装统一的异常处理逻辑。异常处理器能够捕获并处理应用程序中的异常,然后返回适当的错误响应。以下是一个基于 Spring Cloud 的统一异常处理的示例

在 Spring Cloud 中,可以通过自定义异常处理器来封装统一的异常处理逻辑。异常处理器能够捕获并处理应用程序中的异常,然后返回适当的错误响应。以下是一个基于 Spring Cloud 的统一异常处理的示例:


创建自定义异常类:

首先,创建自定义的异常类,继承自 Spring 的 RuntimeException 或其子类。创建一个名为 CustomException 的异常类:


public class CustomException extends RuntimeException {

   // 添加构造方法

   public CustomException(String message) {

       super(message);

   }

}


创建异常处理器:

接下来,创建一个异常处理器类,用于捕获和处理异常,并返回适当的错误响应。实现 Spring 的 ResponseEntityExceptionHandler 类来自定义全局异常处理:


import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice

public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

   @ExceptionHandler(CustomException.class)

   public ResponseEntity<String> handleCustomException(CustomException ex) {

       return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);

   }

   // 添加其他异常处理方法

}


在上述代码中,@ControllerAdvice 注解用于标记异常处理器类,@ExceptionHandler 注解用于指定处理特定异常类型的方法。


注册异常处理器:

最后,在你的 Spring Boot 应用程序中,确保将异常处理器注册为一个 Spring Bean。你可以使用 @Bean 注解将异常处理器添加到 Spring 容器中:


import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class AppConfig {

   @Bean

   public GlobalExceptionHandler globalExceptionHandler() {

       return new GlobalExceptionHandler();

   }

   // 添加其他配置

}


现在,当应用程序中抛出 CustomException 或其他异常时,全局异常处理器将会捕获并处理这些异常,并返回适当的错误响应。


通过以上步骤,在 Spring Cloud 中封装统一的异常处理逻辑,确保应用程序在出现异常时能够返回一致的错误响应,提高代码的可维护性和可读性。同时,也可以根据需要添加更多的异常处理方法,以处理不同类型的异常情况。


测试:

创建控制器 DemoController:


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

@RequestMapping("/demo")

public class DemoController {

   @Autowired

   private DemoService demoService;

   @GetMapping("/hello")

   public String hello() {

       return "Hello, Spring Cloud!";

   }

   @PostMapping("/throw-custom-exception")

   public void throwCustomException(@RequestBody String message) {

       demoService.throwCustomException(message);

   }

}


创建 DemoService:


import org.springframework.stereotype.Service;

@Service

public class DemoService {

   public void throwCustomException(String message) {

       if (message.equals("error")) {

           throw new CustomException("Custom exception occurred.");

       }

   }

}


测试控制器和异常处理器:

使用 Postman 或其他 API 调试工具,创建 POST 请求:


URL: http://localhost:8080/demo/throw-custom-exception

请求体(JSON):"error"

你将得到一个类似如下的响应:


{

   "timestamp": "2023-08-08T08:00:00.000+00:00",

   "status": 400,

   "error": "Bad Request",

   "message": "Custom exception occurred.",

   "path": "/demo/throw-custom-exception"

}

这个响应是由异常处理器 GlobalExceptionHandler 返回的。


请确保你的 Spring Cloud 项目已经配置并启动,然后使用 Postman 模拟调用 /demo/throw-custom-exception 接口来触发自定义异常并验证统一的异常处理是否起作用。


请注意,这只是一个基本示例,可以根据实际需求在控制器和服务中添加更多的逻辑。同时,可能还需要配置 Spring Cloud 微服务架构的各个组件,以便正确运行。

相关文章
|
JSON 前端开发 Java
​SpringCloud统一异常处理
我是小假 期待与你的下一次相遇 ~
332 3
|
前端开发 Java UED
"揭秘!如何以戏剧性姿态,利用SpringCloud铸就无懈可击的异常处理铁壁,让你的微服务架构稳如泰山,震撼业界!"
【9月更文挑战第8天】随着微服务架构的普及,Spring Cloud作为一套完整的微服务解决方案被广泛应用。在微服务架构中,服务间调用频繁且复杂,异常处理成为保障系统稳定性和用户体验的关键。传统的异常处理方式导致代码冗余,降低系统可维护性和一致性。因此,基于Spring Cloud封装统一的异常处理机制至关重要。这样不仅可以减少代码冗余、提升一致性,还增强了系统的可维护性,并通过统一的错误响应格式优化了用户体验。具体实现包括定义全局异常处理器、自定义业务异常以及在服务中抛出这些异常。这种方式体现了微服务架构中的“服务治理”和“契约先行”原则,有助于构建健壮、可扩展的系统。
304 2
|
安全 JavaScript 小程序
Spring Cloud实战 | 第九篇:Spring Cloud整合Spring Security OAuth2认证服务器统一认证自定义异常处理
Spring Cloud实战 | 第九篇:Spring Cloud整合Spring Security OAuth2认证服务器统一认证自定义异常处理
|
SpringCloudAlibaba 前端开发 Java
SpringCloud Alibaba微服务实战二十四 - SpringCloud Gateway的全局异常处理
SpringCloud Alibaba微服务实战二十四 - SpringCloud Gateway的全局异常处理
2659 0
|
JSON 前端开发 Java
Spring Cloud 如何统一异常处理?写得太好了!
Spring Cloud 如何统一异常处理?写得太好了!
442 0
Spring Cloud 如何统一异常处理?写得太好了!
|
JSON SpringCloudAlibaba 数据格式
SpringCloud Alibaba 开发微信公众号 (自定义菜单json请求数据封装)
SpringCloud Alibaba 开发微信公众号 (自定义菜单json请求数据封装)
244 0
|
开发框架 Java 微服务
SpringCloud微服务实战——搭建企业级开发框架(七):自定义通用响应消息及统一异常处理
平时开发过程中,无可避免我们需要处理各类异常,所以这里我们在公共模块中自定义统一异常,Spring Boot 提供 @RestControllerAdvice 注解统一异常处理,我们在GitEgg_Platform中新建gitegg-platform-boot子工程,此工程主要用于Spring Boot相关功能的自定义及扩展。 1、修改gitegg-platform-boot的pom.xml,添加spring-boot-starter-web和swagger依赖,设置optional为true,让这个包在项目之间依赖不传递。
479 0
SpringCloud微服务实战——搭建企业级开发框架(七):自定义通用响应消息及统一异常处理
|
JSON Java 数据格式
Spring Cloud Gateway-自定义异常处理
我们平时在用SpringMVC的时候,只要是经过DispatcherServlet处理的请求,可以通过@ControllerAdvice和@ExceptionHandler自定义不同类型异常的处理逻辑,具体可以参考ResponseEntityExceptionHandler和DefaultHandlerExceptionResolver,底层原理很简单,就是发生异常的时候搜索容器中已经存在的异常处理器并且匹配对应的异常类型,匹配成功之后使用该指定的异常处理器返回结果进行Response的渲染,如果找不到默认的异常处理器则用默认的进行兜底。
1142 0
Spring Cloud Gateway-自定义异常处理
|
Java API 微服务
Spring Cloud实战小贴士:Zuul统一异常处理(一)
Spring Cloud实战小贴士:Zuul统一异常处理(一)
426 0
|
存储 Java API
Spring Cloud实战小贴士:Zuul统一异常处理(二)
Spring Cloud实战小贴士:Zuul统一异常处理(二)
538 0