springboot學(xué)習(xí)之HttpMessageConverter序列化反序列化

http的序列化和反序列化是什么鬼吩愧?之前只聽說過對(duì)象的序列化和反序列化啊顾彰。奔著自己很菜的想法去百度了下极阅。下面看一個(gè)簡(jiǎn)單的springmvc的請(qǐng)求:

@RestController

public class PersonController {

@GetMapping("getPerson")

public Person getPerson(@RequestBody Person person) {

System.err.println("create an person: " + person);

return person;

}

}

? @RestController中有@ResponseBody,可以幫我們把Person?序列化到resp.body中涨享。@RequestBody可以幫我們把req.body的內(nèi)容轉(zhuǎn)化為Person?對(duì)象筋搏。其實(shí),這就是http序列化和反序列化厕隧。

? ?Http協(xié)議的處理過程拆又,TCP字節(jié)流 <---> HttpRequest/HttpResponse <---> 內(nèi)部對(duì)象儒旬,就涉及這兩種序列化。在springmvc中第一步已經(jīng)由Servlet容器(tomcat等等)幫我們處理了帖族,第二步則主要由框架幫我們處理栈源。http序列化就是第二步的操作。

哈哈竖般,原來我們一直都在跟http序列化打交道啊甚垦,http序列化和反序列化就是請(qǐng)求參數(shù)封裝為對(duì)象和解析對(duì)象的過程啊。之前的項(xiàng)目都是以json的形式實(shí)現(xiàn)序列化和反序列化的涣雕。


將請(qǐng)求的json格式數(shù)據(jù)封裝成了person對(duì)象艰亮,之后返回person對(duì)象,瀏覽器得到了json數(shù)據(jù)挣郭。這個(gè)過程是怎樣完成的呢迄埃?其實(shí)核心是HttpMessageConverter接口;springboot的自動(dòng)化裝配功能將會(huì)初始化WebMvcConfigurationSupport類兑障。這個(gè)類就是初始化HttpMessageConverter的侄非。WebMvcConfigurationSupport的靜態(tài)代碼塊中判斷處理類的jar有沒有引入,比如

jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&

ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);

是json的實(shí)現(xiàn)流译,springboot默認(rèn)引入了這個(gè)包逞怨,所以可以處理json的序列化。如果想添加xml的支持福澡,只需引入xml相關(guān)的jar即可叠赦。


WebMvcConfigurationSupport類的addDefaultHttpMessageConverters方法默認(rèn)添加了一些處理類,

有興趣的可以看下革砸。當(dāng)放入了這些HttpMessageConverter實(shí)現(xiàn)類后除秀,就會(huì)處理請(qǐng)求參數(shù)了,那么問題來了算利,放了這么多的實(shí)現(xiàn)類究竟誰來處理呢鳞仙?他根據(jù)一定的規(guī)則(主要是Content-Type、Accept笔时、controller方法的consumes/produces、Converter.mediaType以及Converter的排列順序這四個(gè)屬性)來選擇到底是使用哪一個(gè)

在http的請(qǐng)求頭中有兩個(gè)參數(shù):Accept:表示瀏覽器可以接收什么樣格式的數(shù)據(jù)application/json等

Content-Type:表示請(qǐng)求的數(shù)據(jù)格式是什么樣的application/json等

controller方法的consumes對(duì)應(yīng)的是匹配 請(qǐng)求Content-Type的格式

produces則對(duì)應(yīng)Accept格式

下面實(shí)現(xiàn)一個(gè)處理自定義類型的HttpMessageConverter

1:創(chuàng)建一個(gè)實(shí)現(xiàn)HttpMessageConverter的類

public class MyMessageConverterextends AbstractHttpMessageConverter {

public MyMessageConverter() {

//設(shè)置支持的類型 這里支持的類型是application/x-properties;charset=UTF-8

super(new MediaType("application","x-properties", Charset.forName("UTF-8")));

}

@Override

? ? protected Person readInternal(Class clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException {

//將請(qǐng)求參數(shù)封裝成person對(duì)象 就是請(qǐng)求參數(shù)是properties類型的封裝成person對(duì)象

InputStream inputStream = inputMessage.getBody();

Properties properties =new Properties();

properties.load(new InputStreamReader(inputStream));

String name = properties.getProperty("name");

String phone = properties.getProperty("phone");

Person person =new Person();

person.setName(name);

person.setPhone(phone);

return person;

}

@Override

? ? protected void writeInternal(Person person, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException {

//此方法就是將person對(duì)象封裝成properties返回給瀏覽器

Properties properties =new Properties();

properties.setProperty("name", person.getName());

properties.setProperty("phone", person.getPhone());

OutputStream body = outputMessage.getBody();

properties.store(body,"UTF-8");

}

@Override

? ? protected boolean supports(Class clazz) {

return ClassUtils.isAssignable(Person.class,clazz);

}

}


2 將此處理類添加到配置類中

@Configuration

public class MyWebMvcConfigurationSextends WebMvcConfigurationSupport {

@Override

? ? protected void extendMessageConverters(List> converters) {

super.extendMessageConverters(converters);

converters.add(new MyMessageConverter());

}

}

很簡(jiǎn)單實(shí)現(xiàn)WebMvcConfigurationSupport 類的extendMessageConverters方法就可以了仗岸。

這樣就可以接收properties參數(shù)的請(qǐng)求了允耿。

postman發(fā)送請(qǐng)求

還有個(gè)問題springboot是怎樣自動(dòng)裝配這個(gè)配置的呢?

@SpringBootApplication注解有個(gè)@EnableAutoConfiguration自動(dòng)裝配扒怖,進(jìn)而引入了AutoConfigurationImportSelector.類较锡,此類的作用就是將所有符合條件的@Configuration配置都加載到當(dāng)前SpringBoot創(chuàng)建并使用的IoC容器。在AutoConfigurationImportSelector類中可以看到通過 SpringFactoriesLoader.loadFactoryNames()把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一個(gè)xxxAutoConfiguration文件都加載到容器中其中就包括WebMvcAutoConfiguration引入EnableWebMvcConfiguration.class 進(jìn)而初始化DelegatingWebMvcConfiguration此類就是WebMvcConfigurationSupport的實(shí)現(xiàn)類盗痒。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚂蕴,一起剝皮案震驚了整個(gè)濱河市低散,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骡楼,老刑警劉巖熔号,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸟整,居然都是意外死亡引镊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門篮条,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弟头,“玉大人,你說我怎么就攤上這事涉茧「昂蓿” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵伴栓,是天一觀的道長(zhǎng)伦连。 經(jīng)常有香客問我,道長(zhǎng)挣饥,這世上最難降的妖魔是什么除师? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮扔枫,結(jié)果婚禮上汛聚,老公的妹妹穿的比我還像新娘。我一直安慰自己短荐,他們只是感情好倚舀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忍宋,像睡著了一般痕貌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糠排,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天舵稠,我揣著相機(jī)與錄音,去河邊找鬼入宦。 笑死哺徊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乾闰。 我是一名探鬼主播落追,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼涯肩!你這毒婦竟也來了轿钠?” 一聲冷哼從身側(cè)響起巢钓,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疗垛,沒想到半個(gè)月后症汹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡继谚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年烈菌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片花履。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芽世,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诡壁,到底是詐尸還是另有隱情济瓢,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布妹卿,位于F島的核電站旺矾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏夺克。R本人自食惡果不足惜箕宙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铺纽。 院中可真熱鬧柬帕,春花似錦、人聲如沸狡门。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽其馏。三九已至凤跑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叛复,已是汗流浹背仔引。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褐奥,地道東北人咖耘。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抖僵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缘揪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,734評(píng)論 0 8
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,096評(píng)論 0 3
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • 每次寫完文字耍群,都覺得自己要矯情死了 but我愛死這種感覺了 永遠(yuǎn)追隨當(dāng)下的心境與心情 有話就說义桂,有事就做 不憤世嫉...
    才華者婷小浪兒_閱讀 260評(píng)論 0 2
  • 大叔禁食,晚餐就熬了點(diǎn)白粥蹈垢,配了點(diǎn)上周自己腌制的糖醋蘿卜和大蒜慷吊,想吃的童鞋大叔給你快遞過去。 最近大叔刻意節(jié)食曹抬,時(shí)...
    榴蓮大叔生活食堂閱讀 417評(píng)論 0 0