Spring Boot中@RequestBody空值及406不可接受表征问题排查
嘿,针对你遇到的这两个问题,我来帮你逐个排查解决:
问题1:documentToSignRestRequest所有值为null
这个问题核心原因是请求JSON格式错误+POJO绑定不规范,先看你贴的请求JSON:
{ "obj1": { "key1": "val1", "key2": "val2", "key3": "val3", "key4": "val4" }, "obj2": { "key1": "val1", "key2": "val2", "key3": "val3", "key4": "val4" }, "key": "value, // 这里漏了闭合双引号! "arr": [ "whatever" ], "key": "value" // JSON不允许重复键,解析器会直接忽略或报错 }
这里有两个致命的语法错误:
"key": "value,末尾缺少闭合的双引号,应该修正为"key": "value",- 存在重复的
"key"字段,JSON规范明确禁止对象中有重复键,这会导致解析器无法正确解析整个请求体
除此之外,还要检查你的DocumentToSignRestRequest类:
- 确保类中字段名和JSON的key完全匹配(注意大小写,比如JSON里是
obj1,POJO里不能写成Obj1,如果需要自定义映射可以用@JsonProperty注解) - 必须提供无参构造函数和所有字段的getter/setter方法,Spring MVC依赖这些来完成请求参数到POJO的绑定
- 确认ModelMapper的配置没问题,比如字段名称一致,或者你已经配置了自定义映射规则
问题2:406 Not Acceptable错误
这个错误意味着服务器无法生成你在请求Accept头里指定的媒体类型。结合你的接口配置:
@PostMapping( consumes = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE }, produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE } )
你可以按以下步骤排查:
- 检查Postman的请求头:
- 确保
Accept头设置为application/json或者application/xml(比如Accept: application/json),不要设置服务器不支持的类型(比如text/plain) - 同时
Content-Type头必须是application/json(因为你发送的是JSON请求),要和接口的consumes配置匹配
- 确保
- 确认依赖齐全:
- 如果是Spring Boot项目,确保引入了
spring-boot-starter-web(自带Jackson处理JSON);如果需要支持XML,还要额外引入jackson-dataformat-xml依赖
- 如果是Spring Boot项目,确保引入了
- 检查返回类的序列化能力:
DocumentRest类同样需要无参构造函数和getter/setter方法,确保Jackson能把它序列化为JSON或XML格式的响应
- 先解决问题1再验证:因为请求参数解析失败可能会触发后续的响应异常,先修复JSON和POJO绑定问题,再看406错误是否消失
额外小技巧
- 测试时先简化请求JSON,只传1-2个字段,确认参数能正常绑定后再逐步添加完整内容
- 可以在Controller方法里加个日志打印,方便直观看到请求参数:
log.info("接收到的请求参数:{}", documentToSignRestRequest);
内容的提问来源于stack exchange,提问作者davidvera
相关产品推荐
相关产品推荐

