SpringBoot HttpMessageConverter消息轉換器的使用詳解

消息轉化器的作用

  • 將請求報文轉化為Java對象
  • 將Java對象轉化為響應報文

消息轉化器的主要方法

  • getSupportedMediaTypes:獲取支持的MediaType集合(如:text/html,text/plain,application/json)
  • canRead:判斷是否能讀(請求)
  • read:將請求數據進行格式轉換(canRead方法返回值為true時調用)
  • canWrite:判斷是否能寫(響應)
  • write:將響應數據進行格式轉換(canWrite方法返回值為true時調用)

默認配置的消息轉化器

SpringMVC啟動時會自動配置一些HttpMessageConverter(WebMvcConfigurationSupport類的addDefaultHttpMessageConverters)方法

源碼如下:

	protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
		messageConverters.add(new ByteArrayHttpMessageConverter());
		messageConverters.add(new StringHttpMessageConverter());
		messageConverters.add(new ResourceHttpMessageConverter());
		messageConverters.add(new ResourceRegionHttpMessageConverter());
		try {
			messageConverters.add(new SourceHttpMessageConverter<>());
		}
		catch (Throwable ex) {
			// Ignore when no TransformerFactory implementation is available...
		}
		messageConverters.add(new AllEncompassingFormHttpMessageConverter());
		if (romePresent) {
			messageConverters.add(new AtomFeedHttpMessageConverter());
			messageConverters.add(new RssChannelHttpMessageConverter());
		}
		if (jackson2XmlPresent) {
			Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
			if (this.applicationContext != null) {
				builder.applicationContext(this.applicationContext);
			}
			messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
		}
		else if (jaxb2Present) {
			messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
		}
		if (jackson2Present) {
			Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json();
			if (this.applicationContext != null) {
				builder.applicationContext(this.applicationContext);
			}
			messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
		}
		else if (gsonPresent) {
			messageConverters.add(new GsonHttpMessageConverter());
		}
		else if (jsonbPresent) {
			messageConverters.add(new JsonbHttpMessageConverter());
		}
		if (jackson2SmilePresent) {
			Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.smile();
			if (this.applicationContext != null) {
				builder.applicationContext(this.applicationContext);
			}
			messageConverters.add(new MappingJackson2SmileHttpMessageConverter(builder.build()));
		}
		if (jackson2CborPresent) {
			Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.cbor();
			if (this.applicationContext != null) {
				builder.applicationContext(this.applicationContext);
			}
			messageConverters.add(new MappingJackson2CborHttpMessageConverter(builder.build()));
		}
	}

部分消息轉換器解析

名稱 描述
MappingJackson2HttpMessageConverter 負責讀、寫JSON格式數據(利用Jackson)
AllEncompassingFormHttpMessageConverter 負責讀、寫Form表單數據
Jaxb2RootElementHttpMessageConverter 負責讀、寫XML格式數據(使用JAXB)
ByteArrayHttpMessageConverter 負責讀、寫二進制格式數據
StringHttpMessageConverter 負責讀、寫字符串格式數據
ResourceHttpMessageConverter 負責讀、寫資源文件數據
SourceHttpMessageConverter 負責讀、寫資源數據

註意事項

系統有默認配置的消息轉換器集合。

處理過程會按集合順序匹配合適的消息轉換器,如果有合適的,就會使用該消息轉換器處理(讀、寫),後續的消息轉換器不再執行。

自定義的消息轉換器要想生效,必須放到集合中相同類型的消息轉換器前面,原因參考第二點。

思考:既然自定義的消息轉換器必須放到集合中相同類型的消息轉換器前面,那是否能直接改動集合中原有的消息轉換器來達到自定義的效果,而不必在加一個(暫未沒研究)。

添加自定義消息轉換器時註意默認消息轉換器是否生效

  • WebMvcConfigurer.configureMessageConverters方法會覆蓋默認消息轉換器集合
  • WebMvcConfigurer.extendMessageConverters方法不會覆蓋默認消息轉換器集合

到此這篇關於SpringBoot HttpMessageConverter消息轉換器的使用詳解的文章就介紹到這瞭,更多相關SpringBoot HttpMessageConverter內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: