中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC?HttpMessageConverter消息轉換器怎么使用

發布時間:2023-05-08 15:44:04 來源:億速云 閱讀:113 作者:iii 欄目:開發技術

今天小編給大家分享一下SpringMVC HttpMessageConverter消息轉換器怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    Spring MVC 為開發者提供了方便的開發方式和豐富的功能。其中,HttpMessageConverter 是Spring MVC中非常重要的一個組件,它負責將客戶端提交的請求數據(如JSON、XML等)轉換為Java對象,同時也負責將 Java 對象轉換為客戶端需要的數據格式。

    作用

    在 Spring MVC 中,客戶端通過發送請求,向服務器端請求數據,服務器端接收到請求后需要將請求參數轉換為 Java 對象進行處理,這就需要使用 HttpMessageConverter,它主要負責將HTTP請求中的請求參數轉換為 Java 對象或將 Java 對象轉換為 HTTP 響應中的內容。

    HttpMessageConverter 是一個接口,Spring MVC 中有很多實現類,用于處理不同的數據類型。常見的 HttpMessageConverter 實現類有:

    • ByteArrayHttpMessageConverter:用于處理字節數組類型的數據。

    • StringHttpMessageConverter:用于處理字符串類型的數據。

    • FormHttpMessageConverter:用于處理表單類型的數據。

    • MappingJackson2HttpMessageConverter:用于處理JSON類型的數據。

    • Jaxb2RootElementHttpMessageConverter:用于處理XML類型的數據。

    HttpMessageConverter 接口定義了兩個方法:canRead() 和 canWrite(),分別用于判斷當前的 HttpMessageConverter 是否可以讀取或寫入指定的數據類型。

    • 如果 canRead() 方法返回 true,那么當前的 HttpMessageConverter 就可以將 HTTP 請求中的請求參數轉換為 Java 對象;

    • 如果 canWrite() 方法返回 true,那么當前的 HttpMessageConverter 就可以將Java對象轉換為 HTTP 響應中的內容。

    源碼實現

    下面以 MappingJackson2HttpMessageConverter 為例,講解 HttpMessageConverter 的源碼實現。

    MappingJackson2HttpMessageConverter 是一個用于處理 JSON 類型數據的 HttpMessageConverter 實現類。它繼承了 AbstractJackson2HttpMessageConverter 類,并實現了 HttpMessageConverter 接口。

    canRead()

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

    方法首先調用了 getJavaType() 方法獲取 JavaType 對象

    然后判斷當前的 ObjectMapper 是否可以反序列化 JavaType 對象。

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

    canWrite()

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

    方法首先判斷當前的 ObjectMapper 是否可以序列化指定的 Java 對象

    如果可以序列化并且當前的 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);
        }
    }

    方法首先調用 getJavaType() 方法獲取 JavaType 對象

    然后通過 ObjectMapper 的 readValue() 方法將HTTP請求中的請求參數轉換為 Java 對象。

    如果在轉換的過程中出現了異常,那么就拋出 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);
        }
    }

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

    然后通過 ObjectMapper 的 writeValue() 方法將 Java 對象轉換為 JSON 格式的字符串

    并將結果輸出到 HTTP 響應中。如果在轉換的過程中出現了異常,那么就拋出 HttpMessageNotWritableException 異常。

    異同

    大家是不是覺得與前面文章所講的 MethodArgumentResolver 很相似,都能夠將請求參數轉換為Java對象,但它們的作用和處理流程不同:

    • HttpMessageConverter 會在請求到達 Controller 方法之前進行處理,這意味著它只處理請求參數,而不管 Controller 方法的簽名和參數類型;

    • MethodArgumentResolver 會在 Controller 方法執行之前進行處理,它的作用是將請求參數按照 Controller 方法的參數順序進行解析,并將解析結果映射到 Controller 方法的參數上,然后再調用 Controller 方法

    以上就是“SpringMVC HttpMessageConverter消息轉換器怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    麻江县| 海南省| 朝阳县| 昌黎县| 古交市| 镇原县| 浦城县| 乌兰浩特市| 盐城市| 郎溪县| 广东省| 和田市| 泸溪县| 武山县| 沈丘县| 梁河县| 股票| 德惠市| 博爱县| 东方市| 阜城县| 休宁县| 宁海县| 睢宁县| 巴彦淖尔市| 济宁市| 德江县| 信宜市| 象山县| 三都| 会同县| 乌拉特中旗| 满城县| 射洪县| 婺源县| 湟源县| 塔河县| 筠连县| 磐安县| 云阳县| 灯塔市|