【问题解决】Postman 测试报错 406
现象
Tomcat 日志
org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation
HTTP状态 406 - 不可接收 的报错,核心原因
客户端的请求头
Accept
无法匹配服务端可返回的数据类型(例如 JSON),导致 SpringMVC 无法找到合适的表示(representation)返回
🎯 关键问题分析
原始接口:
@GetMapping("/save")
@ResponseBody
public String save() {
return "{'info': 'springmvc'}";
}
问题原因:
- @ResponseBody + String 返回 JSON 字符串,但 SpringMVC 认为它是
text/plain
类型; - 如果 Postman 的
Accept
请求头为application/json
,SpringMVC 会尝试返回 JSON; - 结果不匹配,服务端无法满足客户端请求的数据格式要求,返回 406
🛠️ 解决方案一:改返回类型 + 自动 JSON 转换
修改返回类型为 Map
或 Java 对象,SpringMVC 会自动将其序列化为 JSON(需引入 Jackson)
修改示例:
@GetMapping("/save")
@ResponseBody
public Map<String, String> save() {
Map<String, String> map = new HashMap<>();
map.put("info", "springmvc");
return map;
}
Maven 依赖 Jackson(Spring6 通常自动包含):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
🛠️ 解决方案二:Postman 设置 Accept
为 text/plain
如果不修改接口代码,仍返回字符串 "{}"
,则 Postman 需要这样设置:
-
在 Headers 中添加:
Accept: text/plain
-
或删除
Accept
头,让它使用默认(*/*
);
🛠️ 解决方案三:显式指定返回类型为 JSON
@GetMapping(value = "/save", produces = "application/json;charset=UTF-8")
@ResponseBody
public String save() {
return "{\"info\": \"springmvc\"}";
}
这样 Spring 会将字符串当成 JSON 返回,避免 406
🧩 总结
方案 | 优点 | 注意 |
---|---|---|
返回对象(Map/类) | 推荐,Spring自动 JSON | 需 Jackson 依赖 |
改 Accept 头 | 快速,适合测试 | 返回非标准 JSON |
指定 produces | 控制精确 | 手写 JSON 且需转义 |