現象
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 且需轉義 |