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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 在 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 微服务架构的各个组件,以便正确运行。

相关文章
|
4月前
|
消息中间件 NoSQL Java
Spring Cloud项目实战Spring Cloud视频教程 含源码
Spring Cloud项目实战Spring Cloud视频教程 含源码
84 1
|
11天前
|
前端开发 Java UED
"揭秘!如何以戏剧性姿态,利用SpringCloud铸就无懈可击的异常处理铁壁,让你的微服务架构稳如泰山,震撼业界!"
【9月更文挑战第8天】随着微服务架构的普及,Spring Cloud作为一套完整的微服务解决方案被广泛应用。在微服务架构中,服务间调用频繁且复杂,异常处理成为保障系统稳定性和用户体验的关键。传统的异常处理方式导致代码冗余,降低系统可维护性和一致性。因此,基于Spring Cloud封装统一的异常处理机制至关重要。这样不仅可以减少代码冗余、提升一致性,还增强了系统的可维护性,并通过统一的错误响应格式优化了用户体验。具体实现包括定义全局异常处理器、自定义业务异常以及在服务中抛出这些异常。这种方式体现了微服务架构中的“服务治理”和“契约先行”原则,有助于构建健壮、可扩展的系统。
27 2
|
26天前
|
Java Spring
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
|
25天前
|
Java Spring 容器
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
|
26天前
|
存储 Java Spring
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
|
26天前
|
SQL Java 数据库连接
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
|
26天前
|
Java 开发工具 Spring
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
|
26天前
|
NoSQL Java Redis
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
|
26天前
|
Java Spring
【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
|
26天前
|
Java Maven Python
【Azure Spring Cloud】部署Azure spring cloud 失败
【Azure Spring Cloud】部署Azure spring cloud 失败