前端 Ajax POST 請求,後端 @RequestBody 接收參數,控制台拋 415。根因:**請求頭 Content-Type 與 SpringMVC 內置的消息轉換器不匹配**。
責任鏈模式:SpringMVC 按順序遍歷已註冊的 HttpMessageConverter,調用 canRead(clazz, mediaType) 判斷是否支持當前請求 Content-Type,支持則調用 read() 反序列化為 Java 對象。
| 轉換器 | 支持 MediaType | 用途 |
|---|---|---|
| ByteArrayHttpMessageConverter | application/octet-stream | 二進制流直讀寫 |
| StringHttpMessageConverter | text/plain, */* | 字符串直接讀寫 |
| ResourceHttpMessageConverter | application/octet-stream | Resource 對象 |
| FormHttpMessageConverter | application/x-www-form-urlencoded multipart/form-data | 表單數據 |
| MappingJackson2HttpMessageConverter | application/json | JSON ↔ POJO (Jackson) |
| Jaxb2RootElementHttpMessageConverter | application/xml, text/xml | XML ↔ POJO (JAXB) |
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
SpringMVC 3.1+ 自動檢測 classpath 中 Jackson,無需手動註冊。
// jQuery Ajax
$.ajax({
url: '/api/user',
type: 'POST',
contentType: 'application/json;charset=UTF-8', // 必須顯式聲明
data: JSON.stringify({name: 'Tom', age: 18}),
success: ...
});
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List> converters) {
// 預設轉換器已含 Jackson,這裡補充 String 支持
converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
// 若需自定義 Jackson 配置
// converters.add(new MappingJackson2HttpMessageConverter(customObjectMapper()));
}
}
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list><value>text/plain;charset=UTF-8</value></list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
HttpMessageConverter 寫出。Accept: application/json → 選擇 Jackson 輸出 JSON。@RestController (等同 @Controller + @ResponseBody)。jackson-databind 是否在 classpath?Content-Type: application/json;charset=UTF-8?WebMvcConfigurer 是否誤覆蓋默認列表?415 本質是「媒體類型不匹配」。確保 依賴完整、請求頭正確、轉換器齊全 三要素,即可消除 99% 的 415 錯誤。掌握 HttpMessageConverter 責任鏈機制,還能靈活擴展自定義協議(如 Protobuf、MessagePack)。