You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:46:25