Spring Boot 3.1.4升级后Multipart文件上传失败求助
Spring Boot 3.1.4升级后Multipart文件上传报错解决方案
问题描述
升级至Spring Boot 3.1.4并完成javax.*到jakarta.*的替换后,调用Multipart文件上传API时触发以下错误:
2024-02-14T14:48:35.476+0530 [http-nio-8080-exec-1] ERROR org.glassfish.jersey.server.ServerRuntime$Responder - Error while closing the output stream in order to commit response. org.glassfish.jersey.server.ContainerException: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided at org.glassfish.jersey.servlet.internal.ResponseWriter.getResponseContext(ResponseWriter.java:278) ~[jersey-container-servlet-core-3.1.3.jar:?]
已尝试的操作:
- 添加了
@MultipartConfig注解 - 在
application.properties中配置了Spring MVC的Multipart参数:
spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=20MB spring.servlet.multipart.max-request-size=20MB
控制器核心代码:
import jakarta.servlet.http.HttpServletRequest; import jakarta.ws.rs.*; import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; @POST @Path("/uploadFiles") @ApiOperation(value = "Upload Files") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) public Response uploadFiles(@Context HttpServletRequest request, @Context HttpHeaders headers) { // 调用request.getParts()时触发错误 }
问题根源
你使用的是**Jersey(GlassFish实现)**作为JAX-RS框架,而spring.servlet.multipart.*配置仅对Spring MVC生效,Jersey有独立的Multipart处理机制,直接调用request.getParts()会因为Jersey未初始化Multipart配置而报错。
解决方案
1. 引入Jersey Multipart依赖
确保项目中添加了Jersey的Multipart处理依赖(版本需与当前Jersey版本匹配,此处为3.1.3):
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>3.1.3</version> </dependency>
2. 注册Jersey MultipartFeature
在Jersey的配置类中注册MultiPartFeature,让Jersey启用Multipart解析能力:
import org.glassfish.jersey.media.multipart.MultiPartFeature; import jakarta.ws.rs.ApplicationPath; import jakarta.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; @ApplicationPath("/api") // 匹配你的API根路径 public class JerseyConfig extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); classes.add(MultiPartFeature.class); classes.add(YourUploadController.class); // 注册你的上传控制器 return classes; } }
3. 修改控制器代码,使用Jersey的Multipart注解
替换直接操作HttpServletRequest的方式,改用Jersey提供的@FormDataParam注解接收文件:
import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.glassfish.jersey.media.multipart.FormDataParam; import java.io.InputStream; @POST @Path("/uploadFiles") @ApiOperation(value = "Upload Files") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) public Response uploadFiles(@FormDataParam("file") InputStream fileStream, @FormDataParam("file") org.glassfish.jersey.media.multipart.FormDataContentDisposition fileMeta) { // 获取文件名:fileMeta.getFileName() // 处理文件流逻辑 return Response.ok().build(); }
额外说明
- 移除不必要的
@MultipartConfig注解,Jersey的Multipart处理机制不需要依赖Servlet规范的该注解。 - 如果需要支持多文件上传,可将参数改为
List<InputStream>和List<FormDataContentDisposition>。
内容的提问来源于stack exchange,提问作者Sravan
相关产品推荐
相关产品推荐

