要處理@RequestBody
註釋參數並注入參數,Spring使用RequestResponseBodyMethodProcessor
。這個HandlerMethodArgumentResolver
做的第一件事是檢查Content-Type
標題。如果缺少,則默認爲application/octet-stream
。然後它會獲取已註冊的HttpMessageConverter
實例的列表。默認情況下,這些都是
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
stringConverter.setWriteAcceptCharset(false);
messageConverters.add(new ByteArrayHttpMessageConverter()); // if your argument is a byte[]
messageConverters.add(stringConverter); // if your argument is a String
messageConverters.add(new ResourceHttpMessageConverter()); // if your argument is a Resource
messageConverters.add(new SourceHttpMessageConverter<Source>()); // if your argument is one of the javax.xml Source classes
messageConverters.add(new AllEncompassingFormHttpMessageConverter()); // for application/x-www-form-urlencoded content-type
if (romePresent) {
messageConverters.add(new AtomFeedHttpMessageConverter()); // for application/atom+xml content-type
messageConverters.add(new RssChannelHttpMessageConverter()); // for application/rss+xml content-type
}
if (jaxb2Present) {
messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); // if your argument class is annotated with @XmlRootElement or @XmlType
}
if (jackson2Present) {
messageConverters.add(new MappingJackson2HttpMessageConverter()); // for content-type application/json and application/*+json (wildcard json)
}
else if (jacksonPresent) {
messageConverters.add(new MappingJacksonHttpMessageConverter()); // in case, but rarely, same as above
}
的RequestResponseBodyMethodProcessor
然後遍歷這個列表,爲了,並呼籲各HttpMessageConverter
canRead()
。如果它返回true
,則RequestResponseBodyMethodProcessor
使用該HttpMessageConverter
來創建參數。如果它從未找到一個,則會拋出一個HttpMediaTypeNotSupportedException
,這使DispatcherServlet
發送一個415響應。
有了上面的默認值,這是不可能的。你將不得不創建並註冊你自己的HttpMessageConverter
可以做到這一點。請注意,它將應用於所有使用@RequestBody
註釋參數的處理程序方法。
作爲一個建議,Content-Type
頭是專門用於這種情況下,你應該使用它。
不要這樣。從文檔:MappingJackson2HttpMessageConverter(或MappingJacksonHttpMessageConverter與Jackson 1.x) HttpMessageConverter實現,可以使用Jackson的ObjectMapper讀取和寫入JSON。通過使用Jackson提供的註釋,可以根據需要定製JSON映射。當需要進一步控制時,可以通過ObjectMapper屬性注入自定義ObjectMapper,以用於需要爲特定類型提供自定義JSON序列化器/反序列化器的情況。默認情況下,該轉換器支持(application/json)。 –