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

Java REST服务文件上传遇415错误及注入源问题排查

嘿,我帮你梳理下这个文件上传的问题——你这是在Spring Boot整合Jersey的时候踩了几个典型的坑,咱们一步步把它解决掉!

问题根源拆解

你遇到的两个错误其实对应了两个配置层面的问题:

  1. 最初用@RequestParam+Jersey依赖出现415错误:Spring MVC的@RequestParam和Jersey的Multipart处理机制不兼容,Jersey有自己一套文件上传的注解和配置逻辑,不能直接混用Spring MVC的注解。
  2. 改@FormDataParam后出现「找不到参数注入源」:这说明Jersey的MultiPartFeature没有被正确注册,导致框架无法识别这个注解的注入规则。
完整解决方案

1. 先把依赖配置弄对

首先要确保jersey-media-multipart的版本和你的Spring Boot/Jersey版本匹配,比如Spring Boot 2.x对应的Jersey版本建议用2.30+。

Maven依赖示例

<!-- Spring Boot Jersey starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<!-- Jersey Multipart 核心依赖 -->
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
</dependency>

Gradle依赖示例

implementation 'org.springframework.boot:spring-boot-starter-jersey'
implementation 'org.glassfish.jersey.media:jersey-media-multipart'

2. 正确注册MultiPartFeature到Jersey配置

你的JerseyConfig必须明确注册MultiPartFeature,而且要确保这个配置类被Spring扫描到(一定要加@Component注解):

import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.stereotype.Component;

@Component
public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        // 扫描你的API接口所在的包
        packages("com.yourproject.api");
        // 关键:注册MultiPartFeature,否则@FormDataParam无法被识别
        register(MultiPartFeature.class);
    }
}

3. 编写符合Jersey规范的文件上传接口

一定要用Jersey的@FormDataParam注解,同时指定接口的消费类型为multipart/form-data:

import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

@Path("/upload")
public class FileUploadResource {

    @POST
    @Path("/file")
    // 必须指定消费类型为multipart/form-data
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
            // 注入文件输入流
            @FormDataParam("file") InputStream fileInputStream,
            // 注入文件元数据(文件名、大小等)
            @FormDataParam("file") FormDataContentDisposition fileDisposition) {

        String fileName = fileDisposition.getFileName();
        String savePath = "/your/save/directory/" + fileName;

        try (FileOutputStream outputStream = new FileOutputStream(new File(savePath))) {
            int read;
            byte[] buffer = new byte[1024];
            while ((read = fileInputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, read);
            }
            return Response.ok("文件上传成功:" + fileName).build();
        } catch (IOException e) {
            e.printStackTrace();
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                    .entity("上传失败:" + e.getMessage())
                    .build();
        }
    }
}

4. Postman请求的正确配置

最后检查Postman的请求设置,别踩小坑:

  • 请求方法选POST,URL填你的接口地址(比如http://localhost:8080/upload/file)
  • Body选择form-data
  • Key填file,Type切换为File,然后选择要上传的文件
  • 不要手动添加Content-Type头,Postman会自动生成带boundary的multipart/form-data头,手动加反而会出错
常见坑点排查
  • 如果还是报415:检查接口的@Consumes注解是否正确,以及JerseyConfig有没有注册MultiPartFeature
  • 如果还是报注入源错误:确认JerseyConfig加了@Component,Spring能扫描到这个配置类;或者检查依赖有没有漏加
  • 如果Spring MVC和Jersey共存:建议给Jersey设置单独的路径前缀(比如/api/*),避免两者的DispatcherServlet冲突

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:35:49