Spring Boot全局异常处理器如何捕获MaxUploadSizeExceededException
问题解决:Spring Boot无法捕获MaxUploadSizeExceededException异常
核心原因
你当前的全局异常处理器无法捕获该异常主要有3个常见触发点:
- @ControllerAdvice限定了仅扫描
storageservice.resource包下的Controller异常,而MaxUploadSizeExceededException是在DispatcherServlet解析multipart请求的阶段抛出,此时还未进入对应Controller的逻辑,被限定范围的异常处理器无法生效 - Tomcat内置的
maxSwallowSize参数默认值小于你配置的文件上传上限,请求体超过该值时Tomcat会直接断开连接,不会将异常抛给Spring处理链 - 自定义前置过滤器提前捕获处理了异常,没有流转到SpringMVC的异常处理链路
解决方案
1. 调整全局异常处理器配置
移除@ControllerAdvice的包范围限定,REST服务建议直接使用@RestControllerAdvice简化返回配置:
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MaxUploadSizeExceededException.class) @ResponseStatus(HttpStatus.PAYLOAD_TOO_LARGE) public ResponseEntity<Object> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException maxUploadSizeExceededException, WebRequest request) { System.out.println("Inside handle max file upload size.."); return buildErrorResponse(maxUploadSizeExceededException, HttpStatus.PAYLOAD_TOO_LARGE); } // 保留原有buildErrorResponse方法实现 }
2. 补全application.properties配置
# 单文件大小上限 spring.servlet.multipart.max-file-size=10MB # 整个multipart请求总大小上限 spring.servlet.multipart.max-request-size=10MB # 调整Tomcat接收请求体上限,设置为略大于请求总大小即可 server.tomcat.max-swallow-size=20MB
3. 排查自定义过滤器
检查栈信息中提到的AsrExceptionFilter等自定义前置过滤器,确认没有提前捕获吞掉MaxUploadSizeExceededException,若有捕获逻辑请调整为将该异常继续向上抛出到SpringMVC处理链。
内容的提问来源于stack exchange,提问作者Roul
相关产品推荐
相关产品推荐

