欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實(shí)現(xiàn)方法

 更新時(shí)間:2022年09月29日 16:55:30   作者:劉婉晴  
這篇文章主要介紹了SpringBoot整合Web開發(fā)其中Json數(shù)據(jù)返回的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、示例代碼

訪問 localhost:8080/jsonTest —— 返回 json 格式的數(shù)據(jù)

@Controller
public class ResponseTestController {
    @ResponseBody // 標(biāo)注 —— 自動(dòng)返回json數(shù)據(jù)
    @GetMapping("/jsonTest")
    public Person testPerson(){
        Person person = new Person();
        person.setAge(20);
        person.setUserName("Liuwanqing");
        Pet pet = new Pet();
        pet.setName("huahua");
        pet.setAge("五個(gè)月");
        person.setPet(pet);
        return person;
    }
}

二、返回值解析原理

SpringBoot 支持的返回值類型是由返回值解析器決定的,SpringBoot 返回值類型如下:

ModelAndView

Model

View

SpringBoot共含15種返回值解析器決定了其支持15種返回值:

三、源代碼分析(debug)

設(shè)置以下幾處斷點(diǎn):

step into —— 返回值處理器邏輯

this.returnValueHandlers.handleReturnValue(returnValue, this.getReturnValueType(returnValue), mavContainer, webRequest);

1. 先找返回值處理器

HandlerMethodReturnValueHandler handler = this.selectHandler(returnValue, returnType);

2. 執(zhí)行下列代碼,找到符合要求的返回值處理器

在眾多返回值處理器中找到符合要求的 —RequestResponseBodyMethodRrocessor

即 RequestResponseBodyMethodRrocessor 可處理標(biāo)注了 @ResponseBody 注解的返回值

   private HandlerMethodReturnValueHandler selectHandler(@Nullable Object value, MethodParameter returnType) {
        boolean isAsyncValue = this.isAsyncReturnValue(value, returnType);
        Iterator var4 = this.returnValueHandlers.iterator();
        HandlerMethodReturnValueHandler handler;
        do {
            do {
                if (!var4.hasNext()) {
                    return null;
                }
                handler = (HandlerMethodReturnValueHandler)var4.next();
            } while(isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler));
        } while(!handler.supportsReturnType(returnType));
        return handler;
    }

3. 調(diào)用返回值處理器(interface HandlerMethodReturnValueHandler)處理:

判斷是否支持這種類型的返回值,支持調(diào)用返回值處理器,調(diào)用 handleReturnValue 進(jìn)行處理

public interface HandlerMethodReturnValueHandler {
    boolean supportsReturnType(MethodParameter var1);
    void handleReturnValue(@Nullable Object var1, MethodParameter var2, ModelAndViewContainer var3, NativeWebRequest var4) throws Exception;
}

4. RequestResponseBodyMethodRrocessor工作原理

關(guān)鍵代碼:

    public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {
        mavContainer.setRequestHandled(true);
        ServletServerHttpRequest inputMessage = this.createInputMessage(webRequest);
        ServletServerHttpResponse outputMessage = this.createOutputMessage(webRequest);
        this.writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
    }

處理返回值的方法

使用消息轉(zhuǎn)換器(涉及內(nèi)容協(xié)商機(jī)制,請(qǐng)移步下文內(nèi)容協(xié)商機(jī)制)進(jìn)行寫出操作,消息轉(zhuǎn)換器工作過程如下:

  1. 瀏覽器告知服務(wù)器其處理能力
  2. 服務(wù)器根據(jù)其自身能力,判斷服務(wù)器能生產(chǎn)什么樣的內(nèi)容
  3. SpringMVC 遍歷所有容器的底層 HttpMessageConverter, 看誰(shuí)能處理

四、內(nèi)容協(xié)商機(jī)制

1. 內(nèi)容協(xié)商

瀏覽器告知服務(wù)器其需要什么類型的服務(wù)類型

瀏覽器可接受的類型:

服務(wù)器得到瀏覽器的處理能力:

服務(wù)器將返回內(nèi)容轉(zhuǎn)為瀏覽器能處理的形式

2. 內(nèi)容協(xié)商原理重點(diǎn)源代碼

   protected List<MediaType> getProducibleMediaTypes(HttpServletRequest request, Class<?> valueClass, @Nullable Type targetType) {
        Set<MediaType> mediaTypes = (Set)request.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);
        if (!CollectionUtils.isEmpty(mediaTypes)) {
            return new ArrayList(mediaTypes);
        } else if (this.allSupportedMediaTypes.isEmpty()) {
            return Collections.singletonList(MediaType.ALL);
        } else {
            List<MediaType> result = new ArrayList();
            Iterator var6 = this.messageConverters.iterator();
            while(true) {
                while(var6.hasNext()) {
                    HttpMessageConverter<?> converter = (HttpMessageConverter)var6.next();
                    if (converter instanceof GenericHttpMessageConverter && targetType != null) {
                        if (((GenericHttpMessageConverter)converter).canWrite(targetType, valueClass, (MediaType)null)) {
                            result.addAll(converter.getSupportedMediaTypes());
                        }
                    } else if (converter.canWrite(valueClass, (MediaType)null)) {
                        result.addAll(converter.getSupportedMediaTypes());
                    }
                }
                return result;
            }
        }
    }

3. HttpMessageConverters消息轉(zhuǎn)換器原理

MessageConverter 規(guī)范

默認(rèn)的MessageConverter

最終 MappingJackson2HttpMessageConverter 把對(duì)象轉(zhuǎn)為JSON(利用底層的jackson的objectMapper轉(zhuǎn)換的)

總結(jié):

  1. 返回值處理器判斷是否支持這種類型的返回值( supportsReturnType)
  2. 返回值處理器調(diào)用handleReturnValue 進(jìn)行處理
  3. 以 @ResponseBody 注解為例,RequestResponseBodyMethodProcessor 可以處理返回值標(biāo)
  4. 最后,利用 MessageConverters 進(jìn)行處理 將數(shù)據(jù)寫為json

到此這篇關(guān)于SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)SpringBoot Json數(shù)據(jù)返回內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)圖片寫入高清字體及帶邊框的方法

    java實(shí)現(xiàn)圖片寫入高清字體及帶邊框的方法

    這篇文章主要介紹了java實(shí)現(xiàn)圖片寫入高清字體及帶邊框的方法,涉及java針對(duì)圖片及文字的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析

    Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析

    這篇文章主要為大家介紹了Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • spring cloud consul使用ip注冊(cè)服務(wù)的方法示例

    spring cloud consul使用ip注冊(cè)服務(wù)的方法示例

    這篇文章主要介紹了spring cloud consul使用ip注冊(cè)服務(wù)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • java 將byte中的有效長(zhǎng)度轉(zhuǎn)換為String的實(shí)例代碼

    java 將byte中的有效長(zhǎng)度轉(zhuǎn)換為String的實(shí)例代碼

    下面小編就為大家?guī)硪黄猨ava 將byte中的有效長(zhǎng)度轉(zhuǎn)換為String的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • java LinkedList的實(shí)例詳解

    java LinkedList的實(shí)例詳解

    這篇文章主要介紹了java LinkedList的實(shí)例詳解的相關(guān)資料,通過本文希望大家能徹底了解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • Netty與NIO超詳細(xì)講解

    Netty與NIO超詳細(xì)講解

    Netty本質(zhì)上是一個(gè)NIO的框架,適用于服務(wù)器通訊相關(guān)的多種應(yīng)用場(chǎng)景。底層是NIO,NIO底層是Java?IO和網(wǎng)絡(luò)IO,再往下是TCP/IP協(xié)議,下面我們跟隨文章來詳細(xì)了解
    2022-08-08
  • 詳解Java中的mapstruct插件使用

    詳解Java中的mapstruct插件使用

    mapstruct 的插件是專門用來處理 domin 實(shí)體類與 model 類的屬性映射的,我們只需定義 mapper 接口,mapstruct 在編譯的時(shí)候就會(huì)自動(dòng)的幫我們實(shí)現(xiàn)這個(gè)映射接口,避免了麻煩復(fù)雜的映射實(shí)現(xiàn),對(duì)Java?mapstruct使用相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-04-04
  • 2023年IDEA最新永久激活教程(親測(cè)可用)

    2023年IDEA最新永久激活教程(親測(cè)可用)

    打開電腦,發(fā)現(xiàn)?IDEA?又更新了一個(gè)小版本,2022.3.2?版本來了,真的是非常高興,那么這么新的版本怎么激活使用呢?下面小編給大家?guī)砹薸dea2023年最新永久激活方法,感興趣的朋友一起看看吧
    2023-04-04
  • Java經(jīng)典面試題匯總--多線程

    Java經(jīng)典面試題匯總--多線程

    本篇總結(jié)的是Java多線程相關(guān)的面試題,后續(xù)會(huì)持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實(shí)習(xí)生或者已經(jīng)工作的同行,如果發(fā)現(xiàn)錯(cuò)誤還望大家多多包涵,不吝賜教,謝謝
    2021-06-06
  • 淺談Spring中單例Bean是線程安全的嗎

    淺談Spring中單例Bean是線程安全的嗎

    這篇文章主要介紹了淺談Spring中單例Bean是線程安全的嗎?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評(píng)論