HttpMessageConverter訊息轉換器
阿新 • • 發佈:2018-11-05
版權宣告:本文為博主原創文章,無需授權即可轉載,甚至無需保留以上版權宣告,轉載時請務必註明作者。
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);
}
}