Spring Boot整合Thymeleaf时如何处理Tomcat的SizeLimitExceededException
问题解决方案
1. 修正全局异常处理类
你之前的全局异常处理类未添加@ControllerAdvice注解,Spring无法识别为异常处理组件,调整后代码如下:
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @ControllerAdvice public class FileUploadExceptionAdvisor { @ExceptionHandler(MaxUploadSizeExceededException.class) public String handleMaxUploadSizeExceeded(MaxUploadSizeExceededException e, RedirectAttributes redirectAttributes) { // 自定义错误提示 redirectAttributes.addFlashAttribute("globalError", "上传文件总大小不能超过50MB,请调整后重新提交"); redirectAttributes.addFlashAttribute("contactEmail", new ContactEmail()); // 重定向回表单页,注意替换为你实际的表单访问路径 return "redirect:/contactForm"; } }
注意:不需要单独处理SizeLimitExceededException,它是MaxUploadSizeExceededException的根异常,Spring已经做了封装,处理前者即可。
2. 调整application.properties配置
添加延迟解析multipart请求的配置,默认multipart请求会在进入控制器前解析,此时抛出的异常无法被@ControllerAdvice捕获:
########################Tomcat file size config############################ spring.servlet.multipart.max-file-size=50MB spring.servlet.multipart.max-request-size=50MB # 开启延迟解析,让异常进入控制器处理阶段 spring.servlet.multipart.resolve-lazily=true # 设为-1表示不限制Tomcat吞噬请求体的大小,避免大文件上传时Tomcat直接断开连接 server.tomcat.max-swallow-size=-1
3. 调整Thymeleaf模板添加全局错误提示
在表单上方添加全局错误提示区域,用于展示超出大小限制的错误:
<div th:if="${globalError != null}" style="color: red; margin-bottom: 10px;" th:text="${globalError}"></div> <form action="#" th:action="@{/sendHTMLMail}" th:object="${contactEmail}" enctype="multipart/form-data" method="post"> <!-- 原有表单内容保持不变 --> </form>
4. 确认表单访问路径
确保你项目中访问联系表单的路径和异常处理中重定向的路径一致,例如你表单的访问路径是/contactForm,返回视图的控制器代码示例如下:
@GetMapping("/contactForm") public String showForm(Model model) { if (!model.containsAttribute("contactEmail")) { model.addAttribute("contactEmail", new ContactEmail()); } return "contactForm.html"; }
原方案失效原因说明
- 未给全局异常类添加
@ControllerAdvice注解,Spring未注册该异常处理组件 - 默认multipart请求解析时机过早,异常抛出时还未进入Spring MVC的异常处理流程
- 异常处理返回视图时未使用重定向,导致模型绑定数据丢失,页面渲染异常
内容的提问来源于stack exchange,提问作者Илиян Д.
相关产品推荐
相关产品推荐

