HttpMediaTypeNotSupportedException本质是客户端Content-Type与服务端consumes声明或@RequestBody使用不匹配。需检查三处:客户端实际请求头、控制器consumes属性、是否遗漏@RequestBody;禁用混用@RequestBody与@RequestParam;Feign调用需显式设Content-Type头。
Spring Boot 接口报
怎么快速定位
这个异常本质是客户端发来的请求体格式(
)和服务端控制器方法声明能接收的格式对不上。不是接口没写,也不是参数解析失败,而是“门牌号贴错了”——你标着只收
,结果对方送来
,Spring 直接拒收。
排查优先看三处:
客户端实际发出的
请求头(用浏览器 DevTools 或
确认)
Controller 方法上
或
的
属性(比如
)
参数前是否漏了
(没它,Spring 默认按表单或查询参数解析,不走 JSON 反序列化)
和
混用导致的
常见错误:前端用
发 JSON,后端却写成这样:
这时 Spring 会尝试把整个 JSON body 当作表单字段拆解,自然失败。根本原因在于:
对应的是
或
,和 JSON 不兼容。
立即学习
“
Java免费学习笔记(深入)
”;
正确做法分两路:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
如果前端发的是 JSON(
),后端必须用
接收一个 POJO 或
如果前端发的是表单数据,就别设
,也别加
,保持
即可
二者不能混在同一方法里——没有“既支持 JSON 又支持表单”的魔法注解
全局配置
改
映射容易踩坑
有人想“一劳永逸”,在
里加
,但这解决不了
——它管的是返回值协商(
头),不是请求体解析(
)。
真正影响请求体解析的是
链,尤其是
和
的注册顺序。常见陷阱:
手动注册了自定义
,但没调用
显式支持
在
中覆盖了默认 converter,却忘了保留
对
的支持,导致纯文本 POST 也报错
Spring Boot 2.6+ 默认禁用
,别指望靠
绕过
校验
Feign 客户端调用时触发该异常的特殊原因
用 Feign 调第三方接口时,即使代码里写了
,也可能报这个错——因为 Feign 默认不自动设置
请求头,尤其当
参数是
或
时。
解决方案很直接:
用
显式声明(最简单)
如果参数是 POJO,确保 Feign 接口方法上标注了
,且引入了
依赖
避免把 JSON 字符串直接塞进
;改用 POJO +
,让 Feign 自动序列化并带上正确 header
注意:Feign 的
控制响应解析,
才控制请求发送,别配反
这个异常表面看是格式问题,实际多数时候是前后端对“谁负责序列化”没对齐。只要盯住
请求头、
注解、以及 Feign/RestTemplate 的自动 header 行为这三点,基本不会卡住。
HttpMediaTypeNotSupportedExceptionContent-Typeapplication/jsonapplication/x-www-form-urlencodedContent-Typecurl -v@PostMapping@PutMappingconsumesconsumes = "application/json"@RequestBody@RequestBody@RequestParamHttpMediaTypeNotSupportedExceptionfetch@PostMapping("/user")
public String save(@RequestParam String name, @RequestParam Integer age) { ... }@RequestParamapplication/x-www-form-urlencodedmultipart/form-dataContent-Type: application/json@RequestBodyMapconsumes = "application/json"@RequestBody@RequestParamWebMvcConfigurerContent-TypeconfigureContentNegotiationmediaType("json", MediaType.APPLICATION_JSON)HttpMediaTypeNotSupportedExceptionAcceptContent-TypeHttpMessageConverterJackson2ObjectMapperBuilderStringHttpMessageConverterMappingJackson2HttpMessageConvertersetSupportedMediaTypesapplication/jsonWebMvcConfigurerStringHttpMessageConvertertext/plainspring.mvc.contentnegotiation.favor-parameter=true?format=jsonContent-Typeconsumes = "application/json"Content-Type@RequestBodyStringbyte[]@Headers("Content-Type: application/json")consumes = "application/json"feign-jackson@RequestBody String json@RequestBodyproducesconsumesContent-Type@RequestBody