使用Jersey Servlet上传文件时遭遇HTTP 415错误求助
看来你踩了Jersey Multipart配置的经典坑了!这个HTTP 415和找不到org.glassfish.jersey.media.multipart.FormDataContentDisposition消息体读取器的错误,90%以上都是因为Multipart的依赖没加对或者Feature没注册导致的,我给你一步步捋清楚解决办法:
1. 确认Multipart依赖已正确添加
首先要确保你的项目里引入了Jersey Multipart的扩展包,而且版本必须和你使用的Jersey核心版本完全一致(版本不匹配是常见的隐形坑):
- 如果用Maven,在
pom.xml里添加:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>你的Jersey核心版本号</version> </dependency>
- 如果用Gradle,在
build.gradle里添加:
implementation 'org.glassfish.jersey.media:jersey-media-multipart:你的Jersey核心版本号'
2. 注册MultipartFeature到Jersey配置
光加依赖还不够,必须让Jersey知道要启用Multipart功能,这一步很容易忘:
- 如果用Java代码配置Jersey:
在你的Application子类里注册MultipartFeature:
import org.glassfish.jersey.media.multipart.MultipartFeature; import javax.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; public class JerseyAppConfig extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); // 必须注册这个Feature classes.add(MultipartFeature.class); // 加上你自己的文件上传资源类 classes.add(YourUploadResource.class); return classes; } }
- 如果用web.xml配置Jersey:
在Servlet的初始化参数里添加MultipartFeature的全类名:
<servlet> <servlet-name>JerseyServlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value> org.glassfish.jersey.media.multipart.MultipartFeature, com.yourpackage.YourUploadResource </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
3. 检查资源方法的参数配置
确保你的文件上传接口参数注解正确,特别是@FormDataParam的参数名要和前端表单的name属性完全匹配:
import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Consumes; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.glassfish.jersey.media.multipart.FormDataParam; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import java.io.InputStream; @Path("/upload") public class YourUploadResource { @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public Response uploadFile( @FormDataParam("file") InputStream fileStream, @FormDataParam("file") FormDataContentDisposition fileDisposition) { // 这里写你的文件处理逻辑,比如保存到服务器 String fileName = fileDisposition.getFileName(); // ... return Response.ok("文件 " + fileName + " 上传成功").build(); } }
对应的前端test.html里的表单也要确保enctype设置正确:
<form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">上传文件</button> </form>
4. 排除版本兼容性问题
如果你之前用的是Jersey 1.x的老依赖(比如com.sun.jersey开头的包),现在切换到2.x的话,一定要彻底替换成org.glassfish.jersey下的包,两者完全不兼容,混用必然会出现这类找不到类的错误。
按照上面的步骤排查一遍,基本就能解决这个问题了!
内容的提问来源于stack exchange,提问作者Andy Mummau
相关产品推荐
相关产品推荐

