首页 > 其他分享 >普通全局异常存在的问题 GlobalExceptionHandler

普通全局异常存在的问题 GlobalExceptionHandler

时间:2023-11-23 19:22:05浏览次数:36  
标签:GlobalExceptionHandler String public Sleep ResponseEntity download 全局 异常 class

简单搭建 Feign 框架

image

parent

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.17</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.5</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

server

@SpringBootApplication
public class AppServer {
    public static void main(String[] args) {
        SpringApplication.run(AppServer.class);
    }
}
@RestController
public class FileController {

    @GetMapping("download")
    public ResponseEntity<byte[]> download() {
        byte[] bytes = FileUtil.readBytes(new File("C:\\Users\\xxx\\Pictures\\企业微信截图_x-x-x-x.png"));
        return ResponseEntity.ok(bytes);
    }

}

client

@SpringBootApplication
@EnableFeignClients
public class AppClient {
    public static void main(String[] args) {
        SpringApplication.run(AppClient.class);
    }
}
public class R<T> {

    private String code;

    private String message;

    private T data;
}
@RestControllerAdvice
@Component
public class GlobalExceptionResolver {

    @ExceptionHandler(Exception.class)
    public R<?> exceptionResolver(Exception e) {
        R<?> r = new R<>();
        r.setMessage("系统错误");
        return r;
    }
}
@FeignClient(url = "http://127.0.0.1:9999/", name = "test")
public interface FileFeinClient {

    @GetMapping("download")
    ResponseEntity<byte[]> download();

}
@RestController
public class ClientFileController {

    @Autowired
    private FileFeinClient fileFeinClient;

    @GetMapping("filedownload")
    public ResponseEntity<byte[]> download(){
        ResponseEntity<byte[]> download = fileFeinClient.download();
        try {
            System.out.println("Sleep Sleep Sleep Sleep ");
            TimeUnit.SECONDS.sleep(5);
            System.out.println("Sleep Complete");
        } catch (InterruptedException e) {

        }

        return download;
    }

}

操作

postman 调用 client,sleep 期间 cancel。

问题

然后 client 的 Controller 返回值会被 HttpEntityMethodProcessor 处理,在 HttpEntityMethodProcessor#handleReturnValue 写响应体(server 返回的,默认是 content-type: application/octet-stream,还未实际写入)。
咋这个方法的最后 writeWithMessageConverters 时,发现连接断开,于是报错,转而走全局异常处理,全局异常处理的 @RestControllerAdvice 是一个组合注解,含 @ResponseBody,于是对于返回值的处理走 RequestResponseBodyMethodProcessor,它处理返回值时写数据走(AbstractMessageConverterMethodProcessor#writeWithMessageConverters(T, MethodParameter, ServletServerHttpRequest, ServletServerHttpResponse)),发现 ServletServerHttpResponse 已经写了 Content-Type,于是找 MessageConverter(这里就是 R -> application/octet-stream),于是没找到,最终抛出异常 HttpMessageNotWritableException。

isCommit
最终向 Response 写数据时,一旦写过(写缓存,即便没有通过网络发送),会设置标志位 committed 为 true,因此可以使用 HttpServletResponse.isCommitted 判断(除了这种情况,什么时候会 isCommited 且抛出异常)。

标签:GlobalExceptionHandler,String,public,Sleep,ResponseEntity,download,全局,异常,class
From: https://www.cnblogs.com/chenxingyang/p/17852293.html

相关文章

  • Unity异常提示 Invalid worldAABB. Object is too large or too far away from the or
    Unity在编辑器退出EditMode进入PlayMode之前,调用了一次Start和Update,然后提供了空的数据。这个时候容易造成除以0的情况,但是Unity没有立刻抛出异常,而是继续执行,生成了一个无穷大的数值。......
  • 引发C++异常的常见原因(一)从报错地址到错误症状
    在进行C++软件开发的过程中,会遇到很多问题,网上差不到,或者查到了也没什么信息可以用,所以这里想到了就将一些常见的问题放在一起,归纳整理一下。本文主要的内容来源于CSDN的大佬文章:https://blog.csdn.net/chenlycly/article/details/125529931,我主要是做个笔记常见问题1.变量未......
  • 基于element-plus全局封装Loading
    代码新建一个loading.ts文件import{ElLoading}from"element-plus";/*全局请求loading*/letloadingInstance:ReturnType<typeofElLoading.service>;/***@description开启Loading**/conststartLoading=()=>{loadingInstance=El......
  • 第 11 节 Python程序调试和异常处理技巧
    常见的错误语法错误:例如,不正确的缩进、未定义的变量、括号不匹配等。运行时错误:例如,尝试访问不存在的文件、内存溢出等。类型错误:例如,将字符串与整数相加等。逻辑错误:例如,程序没有按照预期的流程执行、条件判断不正确等。输入错误:例如,无效的输入、输入的数据类型不正确等。常见的错......
  • python全局锁总结
    一、用Python写个死循环,把N核CPU的核心全部跑满importthreading,multiprocessingdefloop():x=0whileTrue:x=x^1foriinrange(multiprocessing.cpu_count()):t=threading.Thread(target=loop)t.start()启动与CPU核心数量相同的......
  • 线上ES集群参数配置引起的业务异常案例分析
    作者:vivo互联网数据库团队-LiuHuang本文介绍了一次排查Elasticsearchnode_concurrent_recoveries引发的性能问题的过程。一、故障描述1.1故障现象1.业务反馈业务部分读请求抛出请求超时的错误。2.故障定位信息获取故障开始时间19:30左右开始故障抛出异常......
  • core中间件全局日志
    参考学习项目zradmin在Configure中配置请求参数缓存//使可以多次多去body内容app.Use((context,next)=>{context.Request.EnableBuffering();returnnext();//请求通道走向下一步});在Configure......
  • Springboot全局异常处理
    自定义异常枚举类枚举类用于定义自定义的异常类型,对应自定义错误码,错误信息,状态码publicenumErrorCodeEnum{USERINFO_EXCEPTION(10001,HttpStatus.INTERNAL_SERVER_ERROR,"UserInfoException"),AUTHORIZATION_EXCEPTION(10002,HttpStatus.UNAUTHORIZED,"Authoriza......
  • 微服务 Gateway 网关——全局过滤器
     代码步骤: ①网关模块里创建一个类并实现GlobalFilter接口  @Order(-1)//值越小,优先级越高。也可以实现Ordered接口指定优先级@Component//注入到Spring容器publicclassAuthorizeFilterimplementsGlobalFilter{@OverridepublicMono<Void>filt......
  • Python全局解释器锁GIL机制
    全局解释器锁GlobalInterpreterLock,CPython在解释器级别的一把锁,叫GIL全局解释器锁。程序编译成字节码,程序想跑多线程,但是GIL保证CPython进程中,同一时刻只能有一个线程执行字节码。所以,哪怕是在多CPU的情况下,即使每个线程恰好调度到了每个CPU上,有了这把大锁,同时只能有一个CPU......