解决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,类似于这样的:
问题寻因
在将异常信息丢到 gpt 后,我就懂了,返回的信息:
从你的日志中可以看出,出现了一个
IllegalStateException
,并且错误消息为
Cannot call sendError() after the response has been committed
。这个错误通常发生在尝试发送错误响应时,HTTP
响应已经被提交的情况下。以下是一些可能的原因和解决方案:
原因分析
- 重复提交响应:在代码中可能有多个地方试图提交响应。
- 过滤器或拦截器中处理逻辑冲突:在请求处理过程中,某些过滤器或拦截器可能已经提交了响应,但控制流继续下去,又试图再次提交响应。
- 异常处理导致的问题:在异常处理过程中,试图发送错误响应,但响应已经被提交。
这里说明代码中可能有多个地方试图提交响应,而且按前端只返回了文件流来看,应该是传完流关闭了 HttpServletResponse 导致 controller 层的 response 没法返回至前端,导致了异常
问题解决
只需要将 controller 层的导出方法返回 null 或者直接改成 void 方法就行: