Spring Boot MockMvc测试POST接口报Content type not set异常
Spring Boot POST接口单测报「Content type not set + Required request body is missing 400错误」排查修复
首先明确:Content type not set是连带报错,不是根因。Spring没读取到预期的JSON请求体时会直接返回400 BAD_REQUEST,这个默认错误响应不会主动设置Content-Type响应头,才会触发对应断言失败。所有排查都围绕「为什么后端没拿到请求体」展开,不用死磕Content-Type头的设置。
1. 测试类请求写法问题(占这类问题的90%)
- 禁止直接把Java DTO对象传入
content()方法,必须先序列化为JSON字符串:
错误写法:
正确写法:// 错误:content()方法仅接收字符串参数,直接传对象会调用toString()生成非JSON格式内容 mockMvc.perform(post("/api/xxx") .contentType(MediaType.APPLICATION_JSON) .content(reqDto) )// 手动用ObjectMapper序列化DTO为JSON字符串 ObjectMapper om = new ObjectMapper(); String reqJson = om.writeValueAsString(reqDto); mockMvc.perform(post("/api/xxx") .contentType(MediaType.APPLICATION_JSON) .content(reqJson) .andDo(print()) // 加这行可以打印完整请求/响应报文,直接看实际发出的请求体内容 ) - 不要把请求体内容错放到
param()、queryParam()、flashAttr()方法里,这些方法传递的是URL参数/Flash属性,不会写入POST请求体。 - 检查序列化后的JSON字符串是否为空:如果DTO没有对应字段的getter方法、Jackson序列化配置错误,会导致序列化结果为null/空串,等价于没传请求体。
- 检查是否同时调用了
formData()方法传表单参数,该方法会覆盖content()设置的JSON请求体。
2. Controller层方法签名配置错误
- 检查接收请求参数的位置是否加了
@RequestBody注解:
错误写法:
正确写法:// 错误:缺少@RequestBody注解时,Spring默认从URL参数中解析值,不会读取POST请求体 @PostMapping("/api/xxx") public RspDto create(ReqDto req) { // 业务逻辑 }@PostMapping("/api/xxx") public RspDto create(@RequestBody ReqDto req) { // 业务逻辑 } - 检查接口的
consumes配置是否匹配:如果@PostMapping的consumes属性设置为application/x-www-form-urlencoded等非JSON类型,Spring会直接拒绝JSON请求,不会进入请求体解析流程。 - 检查请求路径是否完全匹配:路径末尾多写斜杠、少写路径段导致请求被3xx重定向时,POST请求的请求体会在重定向过程中丢失。
3. Spring测试上下文配置问题
- 如果使用
@WebMvcTest做切片测试,确认MappingJackson2HttpMessageConverter被正常加载:如果自定义了消息转换器配置却没把Jackson的JSON转换器加入列表,Spring无法解析JSON格式的请求体。 - 检查是否配置了自定义过滤器/拦截器:如果自定义鉴权、日志类过滤器提前读取了Servlet请求体(Servlet请求体默认只能读取一次),却没有用可缓存请求体的包装类回写,后续Controller处理时就会拿不到请求体内容。
内容的提问来源于stack exchange,提问作者Rafał
相关产品推荐
相关产品推荐

