最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC HttpMessageConverter消息轉(zhuǎn)換器

 更新時(shí)間:2023年04月11日 08:42:03   作者:這堆干貨有點(diǎn)猛  
??HttpMessageConverter???,報(bào)文信息轉(zhuǎn)換器,將請(qǐng)求報(bào)文轉(zhuǎn)換為Java對(duì)象,或?qū)ava對(duì)象轉(zhuǎn)換為響應(yīng)報(bào)文。???HttpMessageConverter???提供了兩個(gè)注解和兩個(gè)類型:??@RequestBody,@ResponseBody???,??RequestEntity,ResponseEntity??

Spring MVC 為開(kāi)發(fā)者提供了方便的開(kāi)發(fā)方式和豐富的功能。其中,HttpMessageConverter 是Spring MVC中非常重要的一個(gè)組件,它負(fù)責(zé)將客戶端提交的請(qǐng)求數(shù)據(jù)(如JSON、XML等)轉(zhuǎn)換為Java對(duì)象,同時(shí)也負(fù)責(zé)將 Java 對(duì)象轉(zhuǎn)換為客戶端需要的數(shù)據(jù)格式。本文將 從HttpMessageConverter 的作用和源碼實(shí)現(xiàn)兩個(gè)方面進(jìn)行講解。

作用

在 Spring MVC 中,客戶端通過(guò)發(fā)送請(qǐng)求,向服務(wù)器端請(qǐng)求數(shù)據(jù),服務(wù)器端接收到請(qǐng)求后需要將請(qǐng)求參數(shù)轉(zhuǎn)換為 Java 對(duì)象進(jìn)行處理,這就需要使用 HttpMessageConverter,它主要負(fù)責(zé)將HTTP請(qǐng)求中的請(qǐng)求參數(shù)轉(zhuǎn)換為 Java 對(duì)象或?qū)?Java 對(duì)象轉(zhuǎn)換為 HTTP 響應(yīng)中的內(nèi)容。

HttpMessageConverter 是一個(gè)接口,Spring MVC 中有很多實(shí)現(xiàn)類,用于處理不同的數(shù)據(jù)類型。常見(jiàn)的 HttpMessageConverter 實(shí)現(xiàn)類有:

  • ByteArrayHttpMessageConverter:用于處理字節(jié)數(shù)組類型的數(shù)據(jù)。
  • StringHttpMessageConverter:用于處理字符串類型的數(shù)據(jù)。
  • FormHttpMessageConverter:用于處理表單類型的數(shù)據(jù)。
  • MappingJackson2HttpMessageConverter:用于處理JSON類型的數(shù)據(jù)。
  • Jaxb2RootElementHttpMessageConverter:用于處理XML類型的數(shù)據(jù)。

HttpMessageConverter 接口定義了兩個(gè)方法:canRead() 和 canWrite(),分別用于判斷當(dāng)前的 HttpMessageConverter 是否可以讀取或?qū)懭胫付ǖ臄?shù)據(jù)類型。

  • 如果 canRead() 方法返回 true,那么當(dāng)前的 HttpMessageConverter 就可以將 HTTP 請(qǐng)求中的請(qǐng)求參數(shù)轉(zhuǎn)換為 Java 對(duì)象;
  • 如果 canWrite() 方法返回 true,那么當(dāng)前的 HttpMessageConverter 就可以將Java對(duì)象轉(zhuǎn)換為 HTTP 響應(yīng)中的內(nèi)容。

源碼實(shí)現(xiàn)

下面以 MappingJackson2HttpMessageConverter 為例,講解 HttpMessageConverter 的源碼實(shí)現(xiàn)。

MappingJackson2HttpMessageConverter 是一個(gè)用于處理 JSON 類型數(shù)據(jù)的 HttpMessageConverter 實(shí)現(xiàn)類。它繼承了 AbstractJackson2HttpMessageConverter 類,并實(shí)現(xiàn)了 HttpMessageConverter 接口。

canRead()

@Override
public boolean canRead(Class<?> clazz, @Nullable MediaType mediaType) {
    JavaType javaType = getJavaType(clazz, null);
    return (this.objectMapper.canDeserialize(javaType) && canRead(mediaType));
}

方法首先調(diào)用了 getJavaType() 方法獲取 JavaType 對(duì)象

然后判斷當(dāng)前的 ObjectMapper 是否可以反序列化 JavaType 對(duì)象。

如果當(dāng)前的 HttpMessageConverter 可以反序列化 JavaType 對(duì)象并且當(dāng)前的 MediaType 可以被處理,那么就返回 true,否則返回 false。

canWrite()

@Override
public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) {
    return (this.objectMapper.canSerialize(clazz) && canWrite(mediaType));
}

方法首先判斷當(dāng)前的 ObjectMapper 是否可以序列化指定的 Java 對(duì)象

如果可以序列化并且當(dāng)前的 MediaType 可以被處理,那么就返回 true,否則返回 false。

read()

@Override
public T readInternal(Class<? extends T> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException {
    JavaType javaType = getJavaType(clazz, null);
    try {
        return this.objectMapper.readValue(inputMessage.getBody(), javaType);
    }
    catch (JsonProcessingException ex) {
        throw new HttpMessageNotReadableException("JSON parse error: " + ex.getMessage(), ex, inputMessage);
    }
}

方法首先調(diào)用 getJavaType() 方法獲取 JavaType 對(duì)象

然后通過(guò) ObjectMapper 的 readValue() 方法將HTTP請(qǐng)求中的請(qǐng)求參數(shù)轉(zhuǎn)換為 Java 對(duì)象。

如果在轉(zhuǎn)換的過(guò)程中出現(xiàn)了異常,那么就拋出 HttpMessageNotReadableException 異常。

write()

@Override
protected void writeInternal(T t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
    try {
        JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
        JsonGenerator jsonGenerator = this.objectMapper.getFactory().createGenerator(outputMessage.getBody(), encoding);
        writePrefix(jsonGenerator, t);
        this.objectMapper.writeValue(jsonGenerator, t);
        writeSuffix(jsonGenerator, t);
        jsonGenerator.flush();
    }
    catch (JsonProcessingException ex) {
        throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
    }
}

方法首先通過(guò) getJsonEncoding() 方法獲取JSON編碼格式

然后通過(guò) ObjectMapper 的 writeValue() 方法將 Java 對(duì)象轉(zhuǎn)換為 JSON 格式的字符串

并將結(jié)果輸出到 HTTP 響應(yīng)中。如果在轉(zhuǎn)換的過(guò)程中出現(xiàn)了異常,那么就拋出 HttpMessageNotWritableException 異常。

異同

大家是不是覺(jué)得與前面文章所講的 MethodArgumentResolver 很相似,都能夠?qū)⒄?qǐng)求參數(shù)轉(zhuǎn)換為Java對(duì)象,但它們的作用和處理流程不同:

  • HttpMessageConverter 會(huì)在請(qǐng)求到達(dá) Controller 方法之前進(jìn)行處理,這意味著它只處理請(qǐng)求參數(shù),而不管 Controller 方法的簽名和參數(shù)類型;
  • MethodArgumentResolver 會(huì)在 Controller 方法執(zhí)行之前進(jìn)行處理,它的作用是將請(qǐng)求參數(shù)按照 Controller 方法的參數(shù)順序進(jìn)行解析,并將解析結(jié)果映射到 Controller 方法的參數(shù)上,然后再調(diào)用 Controller 方法

總結(jié)

HttpMessageConverter 是Spring MVC 中非常重要的一個(gè)組件,它主要負(fù)責(zé)將 HTTP 請(qǐng)求中的請(qǐng)求參數(shù)轉(zhuǎn)換為 Java 對(duì)象或?qū)?Java 對(duì)象轉(zhuǎn)換為 HTTP 響應(yīng)中的內(nèi)容。Spring MVC 中提供了很多HttpMessageConverter 實(shí)現(xiàn)類,可以處理不同的數(shù)據(jù)類型。

HttpMessageConverter 接口定義了兩個(gè)方法:canRead() 和 canWrite(),分別用于判斷當(dāng)前的 HttpMessageConverter 是否可以讀取或?qū)懭胫付ǖ臄?shù)據(jù)類型。HttpMessageConverter 的源碼實(shí)現(xiàn)中,read() 方法用于將 HTTP 請(qǐng)求中的請(qǐng)求參數(shù)轉(zhuǎn)換為 Java 對(duì)象,write() 方法用于將 Java 對(duì)象轉(zhuǎn)換為 HTTP 響應(yīng)中的內(nèi)容。在具體實(shí)現(xiàn)中,開(kāi)發(fā)者可以根據(jù)自己的需求自定義 HttpMessageConverter 實(shí)現(xiàn)類。

到此這篇關(guān)于SpringMVC HttpMessageConverter消息轉(zhuǎn)換器的文章就介紹到這了,更多相關(guān)SpringMVC HttpMessageConverter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計(jì)模式之觀察者模式(Observer模式)介紹

    Java設(shè)計(jì)模式之觀察者模式(Observer模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式(Observer模式)介紹,Java深入到一定程度,就不可避免的碰到設(shè)計(jì)模式(design pattern)這一概念,了解設(shè)計(jì)模式,將使自己對(duì)java中的接口或抽象類應(yīng)用有更深的理解,需要的朋友可以參考下
    2015-03-03
  • 如何使用MybatisPlus快速進(jìn)行增刪改查詳解

    如何使用MybatisPlus快速進(jìn)行增刪改查詳解

    增刪改查在日常開(kāi)發(fā)中是再正常不多的一個(gè)需求了,下面這篇文章主要給大家介紹了關(guān)于如何使用MybatisPlus快速進(jìn)行增刪改查的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • JAVA實(shí)現(xiàn)社會(huì)統(tǒng)一信用代碼校驗(yàn)的方法

    JAVA實(shí)現(xiàn)社會(huì)統(tǒng)一信用代碼校驗(yàn)的方法

    這篇文章主要介紹了JAVA實(shí)現(xiàn)社會(huì)統(tǒng)一信用代碼校驗(yàn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 詳解java中float與double的區(qū)別

    詳解java中float與double的區(qū)別

    這篇文章主要介紹了JAVA中float與double的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 淺談Java中的參數(shù)傳遞問(wèn)題

    淺談Java中的參數(shù)傳遞問(wèn)題

    這篇文章主要介紹了Java中的參數(shù)傳遞問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SPFA算法的實(shí)現(xiàn)原理及其應(yīng)用詳解

    SPFA算法的實(shí)現(xiàn)原理及其應(yīng)用詳解

    SPFA算法,全稱為Shortest?Path?Faster?Algorithm,是求解單源最短路徑問(wèn)題的一種常用算法,本文就來(lái)聊聊它的實(shí)現(xiàn)原理與簡(jiǎn)單應(yīng)用吧
    2023-05-05
  • java使用URLDecoder和URLEncoder對(duì)中文字符進(jìn)行編碼和解碼

    java使用URLDecoder和URLEncoder對(duì)中文字符進(jìn)行編碼和解碼

    這篇文章主要介紹了java 使用 URLDecoder 和 URLEncoder 對(duì)中文字符進(jìn)行編碼和解碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • MyBatis-Plus中MetaObjectHandler沒(méi)生效完美解決

    MyBatis-Plus中MetaObjectHandler沒(méi)生效完美解決

    在進(jìn)行測(cè)試時(shí)發(fā)現(xiàn)配置的MyMetaObjectHandler并沒(méi)有生效,本文主要介紹了MyBatis-Plus中MetaObjectHandler沒(méi)生效完美解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 詳解Spring Boot Oauth2緩存UserDetails到Ehcache

    詳解Spring Boot Oauth2緩存UserDetails到Ehcache

    這篇文章主要介紹了詳解Spring Boot Oauth2緩存UserDetails到Ehcache,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • SpringBoot項(xiàng)目接入MQTT的詳細(xì)指南

    SpringBoot項(xiàng)目接入MQTT的詳細(xì)指南

    MQTT是一種輕量級(jí)的消息傳輸協(xié)議,特別適用于物聯(lián)網(wǎng)(IoT)場(chǎng)景,具有低帶寬、高延遲網(wǎng)絡(luò)環(huán)境下的優(yōu)勢(shì),SpringBoot作為流行的 Java開(kāi)發(fā)框架,能夠方便地與MQTT集成,實(shí)現(xiàn)高效的消息通信,本文將詳細(xì)介紹如何在SpringBoot項(xiàng)目中接入MQTT,需要的朋友可以參考下
    2025-03-03

最新評(píng)論

阿拉善左旗| 察哈| 玉环县| 甘孜县| 四子王旗| 纳雍县| 略阳县| 绍兴县| 浪卡子县| 保亭| 鄂温| 湘西| 曲沃县| 饶阳县| 南汇区| 晋江市| 漳州市| 棋牌| 花莲县| 玛沁县| 柳河县| 元朗区| 临沧市| 长宁县| 甘南县| 新源县| 沂水县| 香港| 玛沁县| 绥江县| 武隆县| 临高县| 麻阳| 临朐县| 仪陇县| 利川市| 长岛县| 科技| 垦利县| 来宾市| 三江|