如何解决Jersey文件上传接口的415 Unsupported Media Type错误?
我基于org.glassfish.jersey开发了文件上传API,部署到本地WebSphere后,用Postman测试时上传PDF文件出现415 Unsupported Media Type错误。Postman已配置正确的POST请求地址,Body中设置key为file、类型为file,选择目标PDF文件。
我的代码
@POST @Path("/upload") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) public Response uploadImage( @FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetails) { System.out.println(fileDetails.getFileName()); String uploadedFileLocation = "C:/temp/" + fileDetails.getFileName(); // 保存文件 writeToFile(uploadedInputStream, uploadedFileLocation); String output = "File uploaded to : " + uploadedFileLocation; return Response.status(Response.Status.OK).entity(output).build(); } // 将上传的文件写入指定位置 private void writeToFile(InputStream uploadedInputStream, String uploadedFileLocation) { try { OutputStream out = new FileOutputStream(new File( uploadedFileLocation)); int read = 0; byte[] bytes = new byte[1024]; out = new FileOutputStream(new File(uploadedFileLocation)); while ((read = uploadedInputStream.read(bytes)) != -1) { out.write(bytes, 0, read); } out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } }
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd" version="3.0"> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer </servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.javatpoint.rest</param-value> </init-param> <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.filter.LoggingFilter; org.glassfish.jersey.media.multipart.MultiPartFeature </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
解决办法
1. 确保Multipart依赖完整
Jersey的MultiPartFeature需要对应依赖包,检查项目中是否包含jersey-media-multipart,且版本与Jersey核心版本一致。Maven项目可添加依赖:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>你的Jersey版本号</version> </dependency>
同时,WebSphere自带的Jersey可能和项目依赖冲突,建议将项目依赖打包进WAR,并设置WebSphere的类加载策略为PARENT_LAST,避免容器类覆盖项目依赖。
2. 校验Postman请求头
Postman选择file类型时会自动设置Content-Type: multipart/form-data,但偶尔会出现异常。手动确认请求头中该字段是否正确,或删除手动设置的Content-Type,让Postman自动生成。
3. 配置WebSphere的MIME映射
在web.xml中添加PDF的MIME类型映射,确保容器正确识别文件类型:
<mime-mapping> <extension>pdf</extension> <mime-type>application/pdf</mime-type> </mime-mapping>
4. 确认MultiPartFeature注册正确
检查web.xml中jersey.config.server.provider.classnames的参数格式,避免换行或空格导致MultiPartFeature未被正确识别。也可通过代码注册补充:
在Jersey配置类中添加:
register(MultiPartFeature.class);
5. 规避WebSphere内置Servlet干扰
WebSphere的内置multipart处理Servlet可能与Jersey冲突,尝试调整Jersey的Servlet映射优先级,或禁用容器的multipart自动处理功能。
内容的提问来源于stack exchange,提问作者Spam Garbage

