首页 > 编程问答 >Spring 云网关 MVC 异常处理

Spring 云网关 MVC 异常处理

时间:2024-06-06 12:25:58浏览次数:21  
标签:spring-mvc exception error-handling spring-cloud spring-cloud-gateway

我正在编写一个使用 Spring Cloud Gateway MVC 构建的 API Gateway 应用程序。我使用了一个自定义的 CircuitBreaker 过滤器,该过滤器可在后端请求耗时过长时超时。

我发现当请求超时时......我无法通过向客户端发送 JSON 格式的响应来优雅地处理失败。

我拥有带有 ExceptionHandler 方法的自定义 ControllerAdvice Bean,这些方法似乎无法拦截 Gateway MVC 过滤器中的任何故障。当故障发生在 GatewayMVC 筛选器之外(如无法找到匹配的路由等)时,异常处理可完美运行。

ControllerAdvice Bean 是否应处理 GatewayFilter 故障?我们拥有的是 RouterFunctions,而不再是 MVC 控制器。

Any guidance on ExceptionHandling for SpringGatewayMVC?

感谢您的帮助。


ControllerAdvice Bean 不处理 GatewayFilter 异常。

这是因为 GatewayFilter 在 Spring Web MVC 的 DispatcherServlet 之前 运行。ControllerAdvice 异常处理机制是 Spring Web MVC 的一部分,并且仅处理 DispatcherServlet 处理请求期间抛出的异常。

为 Spring Cloud Gateway MVC 处理异常的解决方案:

  1. 使用 GatewayFilter 中的 one rrorResume 操作符:

  2. 在你的自定义 CircuitBreaker GatewayFilter 中,使用 one rrorResume 操作符捕获超时异常。

  3. one rrorResume 回调中,构造并返回一个带有 JSON 错误响应的 Mono<Response>> 对象。

```java @Component public class CustomCircuitBreakerFilter implements GlobalFilter, Ordered {

   @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
       return chain.filter(exchange)
               .timeout(Duration.ofMillis(500)) // 设置超时时间
               .onErrorResume(TimeoutException.class, 
                       ex -> Mono.just(ResponseEntity.status(HttpStatus.GATEWAY_TIMEOUT)
                               .body(Collections.singletonMap("error", "Request timeout"))));
   }

   @Override
   public int getOrder() {
       return -1; // 在其他过滤器之前执行
   }

} ```

  1. 使用 Spring Cloud Gateway 的全局错误处理:

  2. 创建一个实现 ErrorWebExceptionHandler 接口的 Bean。

  3. handle() 方法中,检查异常类型并返回自定义的 JSON 错误响应。

```java @Component public class JsonExceptionHandler implements ErrorWebExceptionHandler {

   @Override
   public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
       if (ex instanceof TimeoutException) {
           // 处理超时异常
           exchange.getResponse().setStatusCode(HttpStatus.GATEWAY_TIMEOUT);
           // ... 设置 JSON 响应体
       } else {
           // 处理其他异常
       }
       return Mono.empty();
   }

   // ... 其他必需的方法

} ```

注意: 要启用全局错误处理,需要在 Spring 配置中将 ErrorWebExceptionHandler Bean 注册为主要 Bean。

通过这两种方法,可以在 Spring Cloud Gateway MVC 应用程序中优雅地处理超时和其他异常,并向客户端返回 JSON 错误响应。

标签:spring-mvc,exception,error-handling,spring-cloud,spring-cloud-gateway
From: 78295133

相关文章

  • java ArrayIndexOutOfBoundsException数组越界异常
    Java中的ArrayIndexOutOfBoundsException(数组越界异常)是一种运行时异常,表示访问了数组的非法索引位置。在数组中,索引从0开始,并以数组长度减一为上限。如果使用了小于0或大于等于数组长度的索引,就会抛出ArrayIndexOutOfBoundsException异常。以下是一个示例代码,演示了这个异常......
  • Java IOException输入输出异常
    Java的IOException是指在进行输入输出操作时产生的异常。它是IOException类或其子类的实例。IOException是一个受检异常,意味着在方法签名中必须声明或捕获它,否则代码将无法通过编译。常见的IOException包括:FileNotFoundException:当尝试打开文件时,如果指定的文件不存在。EOFE......
  • zookeeper:Unexpected exception, exiting abnormally ::java.io.EOFException
    转载请注明出处:服务器中断,重启服务器在重启kafka服务时,遇到如下报错:2024-06-0513:52:56,251[myid:]-ERROR[main:ZooKeeperServerMain@64]-Unexpectedexception,exitingabnormallyjava.io.EOFExceptionatjava.io.DataInputStream.readInt(DataInputStream.j......
  • Spring-MVC注解支持Ant风格的模糊匹配和Restful风格的接收数据------Spring-MVC框架
    packagecom.alatus.mvc3.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;@ControllerpublicclassIndexController{......
  • Docker---java.sql.SQLNonTransientConnectionException: Could not create connectio
    文章目录一、问题场景二、问题分析及解决2.1问题分析2.2问题解决2.2.1有改动未重启容器2.2.2数据库配置不对三、结束一、问题场景使用docker容器控制数据库时,启动服务报错:java.sql.SQLNonTransientConnectionException:Couldnotcreateconnectiontodat......
  • [ROS报错问题]SystemError: initialization of cv_bridge_boost raised unreported ex
            在运行ROS代码时,很多人会使用到cv_bridge库,这个库的主要功能是帮助在ROS的图像消息(sensor_msgs/Image)和OpenCV的图像格式(cv::Mat)之间进行转换。然而,有时在使用cv_bridge时会遇到一个让人头疼的问题,即报错:fromcv_bridge.boost.cv_bridge_boostimportcvt......
  • 初学者springboot启动报错Caused by: java.lang.IllegalArgumentException: Invalid v
    本人第一次接触springboot框架本来想用mybatis连接数据库,引入mybatisplus配置就启动报错packagecom.hu.springboot_mybatis.dao;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.hu.springboot_mybatis.pojo.UserPojo;importorg.apache.ibatis.ann......
  • 记一次NoResourceFoundException: No static resource异常
    org.springframework.web.servlet.resource.NoResourceFoundException:Nostaticresource是Controller层,Rest接口的定义错误ApiPost工具访问,调用接口报错改为@RestController注解......
  • ### Cause: java.sql.SQLSyntaxErrorException: Expression #4 of SELECT list is not
    最近把线上数据库备份到本地数据库进行一些代码修改时候,发现代码连接本地数据库报错,线上数据库是正常的,后来查阅了一下是SELECT列表不在GROUPBY语句内且存在不函数依赖GROUPBY语句的非聚合字段,算是比较严谨的sql模式,如果需要解决的话需要修改一下my.ini配置页面,我先去自己安装......
  • Spring 项目整合 Junit 一直报 java.lang.NullPointerException空指针异常
    1.异常信息java.lang.NullPointerException:Cannotinvoke"com.yue.service.StudentService.changeInfo()"because"this.studentService"isnull2.测试代码packagecom.yue.test;importcom.yue.config.DataSourceConfig;importcom.yue.service.Stud......