【发布时间】:2025-12-16 11:30:01
【问题描述】:
我正在Spring Guide 运行完整版本的 Spring boot Upload 文件指南,但我使用 Undertow 作为嵌入式 servlet 而不是 Tomcat 默认值。它奏效了。
当我尝试上传大小大于配置文件中值的文件时
spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB
它引发异常。这是预期的行为
使用Tomcat内嵌的servlet,可以通过捕捉SizeLimitExceededException或MultipartException轻松处理
但是使用 Undertow,它会引发 RuntimeException 事件,我在全局处理程序中捕获它:
@ControllerAdvice
public class GlobalControllerExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({RuntimeException.class, Exception.class, IOException.class})
ResponseEntity<?> handleControllerException(Exception exc, HttpServletRequest request, Throwable ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
异常消息:
java.lang.RuntimeException: java.io.IOException: UT000020: Connection terminated as request was larger than 131072
at io.undertow.servlet.spec.HttpServletRequestImpl.parseFormData(HttpServletRequestImpl.java:779) ~[undertow-servlet-1.4.20.Final.jar:1.4.20.Final]
at io.undertow.servlet.spec.HttpServletRequestImpl.getParameter(HttpServletRequestImpl.java:653) ~[undertow-servlet-1.4.20.Final.jar:1.4.20.Final]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:75) ~[spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE]
代码如下:
控制器
@PostMapping("/")
public String handleFileUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
storageService.store(file);
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded " + file.getOriginalFilename() + "!");
return "redirect:/";
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-uploading-files</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>1.3.0.RELEASE</version>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
有人跟我有同样的问题吗?超过最大文件大小上传时如何捕获异常?
任何帮助将不胜感激
【问题讨论】:
-
对我来说(可能在 spring-boot 中)它看起来像一个错误,即违反 spring.http.multipart.max-file-size 的异常可以使用 ExceptionHandler 与一个容器而不是其他...... .
-
看起来 spring-boot 正确地将 spring 属性映射到 servlet 规范属性,并且限制正确适用于 tomcat 和 undertow。 HttpServletRequest.getParts() 契约定义了当达到 maxFileSize 或 maxRequestSize 时应该抛出一个 IllegalStateException,它被 spring 包装在一个 MultipartException 中。这个接触后面没有undertow,导致在不同的点抛出错误,spring不处理,所以异常从框架中逃逸出来,不被任何定义的@ExceptionHandler方法处理。
-
我还提出了关于 undertow jira 的问题。你可以在这里关注它:issues.jboss.org/browse/UNDERTOW-1227
-
我遇到了同样的问题。看起来@YannisSermetziadis 提出的问题已在
1.4.22.Final中得到解决,但是在升级 Spring Boot 和 Undertow 之后,我仍在努力在我的@ControllerAdvice中捕获此异常。java.lang.IllegalStateException: io.undertow.server.RequestTooBigException: UT000020: Connection terminated as request was larger than 15728640你解决了吗? -
@PatrickBray,你找到解决方案了吗?
标签: java spring-boot undertow