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

如何解决Jersey文件上传接口的415 Unsupported Media Type错误?

问题:Jersey文件上传API部署到WebSphere后上传PDF报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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:01:21