解决java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

解决在文件导出的过程中出现了异常

解决java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

前言

在做文件导出业务时我遇到了这么个异常:

异常信息

文件是可以正常导出的,这个异常也没法在下面的 at 定位是具体哪个类发生了异常,于是我先去定位是前端还是后端的问题,在前端的返回值那边console.log()了一下:

前端代码
返回值

可以发现就返回了文件的 base64 码但没有返回统一的 response,类似于这样的:

统一response

问题寻因

在将异常信息丢到 gpt 后,我就懂了,返回的信息:

从你的日志中可以看出,出现了一个 IllegalStateException,并且错误消息为 Cannot call sendError() after the response has been committed。这个错误通常发生在尝试发送错误响应时,HTTP 响应已经被提交的情况下。以下是一些可能的原因和解决方案:

原因分析

  1. 重复提交响应:在代码中可能有多个地方试图提交响应。
  2. 过滤器或拦截器中处理逻辑冲突:在请求处理过程中,某些过滤器或拦截器可能已经提交了响应,但控制流继续下去,又试图再次提交响应。
  3. 异常处理导致的问题:在异常处理过程中,试图发送错误响应,但响应已经被提交。

这里说明代码中可能有多个地方试图提交响应,而且按前端只返回了文件流来看,应该是传完流关闭了 HttpServletResponse 导致 controller 层的 response 没法返回至前端,导致了异常

问题解决

只需要将 controller 层的导出方法返回 null 或者直接改成 void 方法就行:

controller层代码