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

REST API仅声明@Produces(APPLICATION_JSON)却报415 Unsupported MediaType求助

问题解析与解决办法

嘿,这个问题我之前处理过,咱们来掰扯清楚为啥会这样,以及怎么解决:

为什么会出现415错误?

首先得明确两个注解的核心作用:

  • @Produces(MediaType.APPLICATION_JSON):只定义了这个API返回的响应媒体类型是JSON,和它能接收的请求类型完全没关系。
  • 当你没给API标注@Consumes时,JAX-RS(比如Jersey、RESTEasy这类常用实现)的默认逻辑是:尝试找到能匹配请求Content-Type的消息阅读器。

那为啥发application/json能正常响应?因为你的项目里大概率已经引入了JSON处理依赖(比如Jackson),JAX-RS会自动注册对应的JSON消息阅读器,能顺利解析JSON请求体。但multipart/form-data是完全不同的媒体类型,默认没有对应的消息阅读器注册,服务器找不到能处理该请求类型的方式,就返回了415 Unsupported Media Type错误。

针对不同需求的解决办法

情况1:你的API本来就应该接收JSON请求

这种情况下,最规范的做法是显式加上@Consumes(MediaType.APPLICATION_JSON),既明确了API的接收类型,也能避免后续的歧义:

@POST
@Path("/somePath")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON) // 显式指定接收JSON格式请求
public Response yourApiEndpoint(YourRequestDto requestBody) {
    // 业务逻辑处理
    return Response.ok(yourResponseObject).build();
}

情况2:你的API需要接收multipart/form-data请求(比如上传文件、表单数据)

如果是这种需求,你需要做三件事:

  1. 给API加上@Consumes(MediaType.MULTIPART_FORM_DATA)注解,明确它能接收的请求类型
  2. 确保项目中引入了multipart处理的依赖(比如Jersey用jersey-media-multipart,RESTEasy用resteasy-multipart-provider)
  3. 方法参数用@FormDataParam来绑定multipart中的各个部分,示例代码:
@POST
@Path("/somePath")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA) // 指定接收multipart格式请求
public Response handleFileUpload(
        @FormDataParam("file") InputStream fileStream,
        @FormDataParam("file") FormDataContentDisposition fileMeta,
        @FormDataParam("description") String fileDesc) {
    // 处理文件上传、表单参数的逻辑
    return Response.ok(new UploadResponse("上传成功")).build();
}

小提醒

@Produces和@Consumes是完全独立的两个注解:前者管输出(响应的媒体类型),后者管输入(请求的媒体类型)。哪怕你的API返回JSON,也可以根据需求接收JSON、form-data甚至其他类型的请求,只要正确配置@Consumes和对应的消息处理器就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:09:51