首頁  >  文章  >  Java  >  SpringBoot HttpMessageConverter訊息轉換器如何使用

SpringBoot HttpMessageConverter訊息轉換器如何使用

PHPz
PHPz轉載
2023-05-10 19:40:041715瀏覽

訊息轉換器的作用

  • 將請求封包轉換為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#ByteArrayHttpMessageConverter1寫、寫二進位格式資料負責讀取、寫入字串格式資料
StringHttpMessageConverter

ResourceHttpMessageConverter

負責讀取、寫入資源檔案資料

SourceHttpMessageConverter

負責讀取、寫入資源資料

  • #注意事項

    系統有預設配置的訊息轉換器集合。
  • 處理程序會依集合順序來搭配適當的訊息轉換器,如果有適當的,就會使用該訊息轉換器來處理(讀、寫),後續的訊息轉換器就不再執行。

    自訂的訊息轉換器要想生效,必須放到集合中相同類型的訊息轉換器前面,原因參考第二點。
思考:既然自訂的訊息轉換器必須放到集合中相同類型的訊息轉換器前面,那麼是否能直接改動集合中原有的訊息轉換器來達到自訂的效果,而不必在加一個(暫未沒研究)。 ######新增自訂訊息轉換器時注意預設訊息轉換器是否生效#############WebMvcConfigurer.configureMessageConverters方法會覆寫預設訊息轉換器集合####### #####WebMvcConfigurer.extendMessageConverters方法不會覆寫預設訊息轉換器集合#########

以上是SpringBoot HttpMessageConverter訊息轉換器如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除