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请求(比如上传文件、表单数据)
如果是这种需求,你需要做三件事:
- 给API加上
@Consumes(MediaType.MULTIPART_FORM_DATA)注解,明确它能接收的请求类型 - 确保项目中引入了multipart处理的依赖(比如Jersey用
jersey-media-multipart,RESTEasy用resteasy-multipart-provider) - 方法参数用
@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
相关产品推荐
相关产品推荐

