1. 程式人生 > >HttpMessageConverter訊息轉換器

HttpMessageConverter訊息轉換器

版權宣告:本文為博主原創文章,無需授權即可轉載,甚至無需保留以上版權宣告,轉載時請務必註明作者。
https://blog.csdn.net/weixin_43453386/article/details/83615829

HttpMessageConverter訊息轉換器

一、HttpMessageConverter解決了什麼問題

前提:
HTTP 請求和響應是基於文字 的,意味著瀏覽器和伺服器通過交換原始文字進行通訊。
java 中處理業務邏輯,都是以一個個有 業務意義的物件 為處理維度的

思考:
使用 controller中的方法返回 String 型別和域模型(或其他 Java 內建物件)。
如何將物件序列化/反序列化為原始文字?
文字到java物件的阻抗問題?

解決:
HttpMessageConverter 處理

Http請求和響應報文字質上都是一串字串。

  • 請求報文——》被封裝成為一個ServletInputStream的輸入流,供我們讀取報文,把報文轉成java物件
  • 響應報文——》被封裝成為一個ServletOutputStream的輸出流,來輸出響應報文。

1、HttpMessageConverter介面

public interface HttpMessageConverter<T> {

    boolean canRead(Class<?> clazz, MediaType mediaType);

    boolean canWrite(Class<?> clazz, MediaType mediaType);

    List<MediaType> getSupportedMediaTypes
(); T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException; void write(T t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException; }

2、HttpMessageConverter處理過程

@RequestMapping(value="/test", method=RequestMethod.POST)
public @ResponseBody String test(@RequestBody String name) {
    return "my name is '" + name+ "'";
}

在SpringMVC進入test方法前:
根據@RequestBody註解選擇適當的HttpMessageConverter實現類來將請求引數解析到name變數中,具體來說是使用了StringHttpMessageConverter類,它的canRead()方法返回true,然後它的read()方法會從請求中讀出請求引數,繫結到test()方法的name變數中。

當SpringMVC執行test方法後:
由於返回值標識了@ResponseBody,SpringMVC將使用StringHttpMessageConverter的write()方法,將結果作為String值寫入響應報文,當然,此時canWrite()方法返回true。

在這裡插入圖片描述

二、HttpMessageConverter在SpringBoot中的配置


import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.ArrayList;
import java.util.List;


@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public HttpMessageConverters fastJsonConfigure() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //日期格式化
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.BrowserCompatible, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect);
        converter.setFastJsonConfig(fastJsonConfig);
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastMediaTypes.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(fastMediaTypes);
        return new HttpMessageConverters(converter);
    }


}