Spring Boot中MultipartFile上传报415及Jersey注入异常排查
解决Jersey文件上传的「No injection source found」问题
我帮你梳理下当前遇到的问题并给出针对性解决方案:
问题背景
你最初尝试用Spring的MultipartFile实现文件上传接口时遇到HTTP 415错误;改用Jersey的FormDataParam方案后,又出现了参数注入失败的核心报错:
org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. [[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response com.example.tsi.channel.endpoint.v1.impl.FileUploadController.uploadPicture(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at index 0.
错误原因分析
这个报错本质是Jersey无法识别@FormDataParam注解的参数注入逻辑,主要由两个核心问题导致:
- 缺失Jersey Multipart依赖:
FormDataParam和MultiPartFeature属于独立的jersey-media-multipart模块,你的依赖树中未包含该模块,导致相关功能无法生效。 - 代码细节错误:控制器中存在变量名拼写错误,虽不直接引发注入失败,但会影响后续文件信息的获取。
具体解决方案
1. 添加Jersey Multipart依赖
在你的pom.xml(Maven项目)中添加与当前Jersey版本匹配的依赖:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>2.23.2</version> <!-- 必须与jersey-server版本保持一致 --> </dependency>
如果是Gradle项目,对应配置为:
implementation 'org.glassfish.jersey.media:jersey-media-multipart:2.23.2'
2. 修正控制器中的拼写错误
你代码里的变量名filFormDataContentDisposition多了一个冗余前缀,修正为:
@FormDataParam("file") FormDataContentDisposition fileFormDataContentDisposition
3. 确保JerseyConfig被Spring正确识别
给JerseyConfig添加@Configuration注解,让Spring将其作为配置类加载:
import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; import org.springframework.context.annotation.Configuration; @Configuration public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(MultiPartFeature.class); register(FileUploadController.class); } }
4. 修正后的完整控制器代码
import java.io.InputStream; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; import org.springframework.stereotype.Component; @Path("/media") @Produces(MediaType.APPLICATION_JSON) @Component public class FileUploadController { @Path("/upload") @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public Response uploadPicture( @FormDataParam("file") InputStream file, @FormDataParam("file") FormDataContentDisposition fileFormDataContentDisposition) { // 这里可以添加FTP文件上传逻辑 String fileName = fileFormDataContentDisposition.getFileName(); System.out.println("接收的文件名:" + fileName); return Response.ok().build(); } }
测试提示
用Postman测试时,确保请求设置正确:
- 请求方法选择
POST - 路径填写
http://localhost:8030/media/upload - 选择
form-data格式,键名设置为file,类型选择File并上传测试文件
内容的提问来源于stack exchange,提问作者Sohaib Jamal
相关产品推荐
相关产品推荐

