SpringBoot - HttpMessageConverter@RestController中有@ResponseBody,可以帮我们把java对象序列化到resp.body中。@RequestBody可以帮我们把req.body的内容转化为java对象。HTTP 请求和响应是基于文本的,意味着浏览器和服务器通过交换原始文本进行通信。但是,使用 Spring,controller 类中的方法返回纯 ‘String’ 类型和域模型(或其他 Java 内建对象)。如何将对象序列化/反序列化为原始文本?这由HttpMessageConverter 处理。Http请求和响应报文本质上都是一串字符串,当请求报文来到java世界,它会被封装成为一个ServletInputStream的输入流,供我们读取报文。响应报文则是通过一个ServletOutputStream的输出流,来输出响应报文,我们从流中,只能读取到原始的字符串报文,同样,我们往输出流中,也只能写原始的字符。而在java世界中,处理业务逻辑,都是以一个个有业务意义的对象为处理维度的,那么在报文到达SpringMVC和从SpringMVC出去,都存在一个字符串到java对象的阻抗问题。这一过程,不可能由开发者手工转换。HttpMessageConverter 有一下默认的converters, 我们也可以定义自己的converter 这里不阐述 注册自定义的converter.
package spring.config;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import spring.filter.MyFilter;import spring.filter.MyFilter1;
import java.nio.charset.Charset;import java.util.List;
/** * @Title: WebConfig* @Description: * @author yc36994 * @date Jul 29, 2020 * @version 1.0 */
@Configuration
public class WebConfig extends WebMvcConfigurationSupport{
@Bean
public StringHttpMessageConverter getMyMessageConverter(){
return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
@Override
protected void configureMessageConverters(List> converters) {
//add自己的converters,所有default的converters会被remove,
所以这里你可以在调用addDefaultHttpMessageConverters
converters.add(getMyMessageConverter());
addDefaultHttpMessageConverters(converters);
}
@Override
protected void extendMessageConverters(List> converters) {
//add自己的,default的会依然保留, 所以一般我们会选用这个方法插入自己的message converters
//这里只能add自定义的converters,例如你add下面的StringHttpMessageConverts就不会生效, // 会被他default里面的StringHttpMessageConvertor覆盖
//converters.add(getMyMessageConverter());
}
}