-
Strategy interface that specifies a converter that can convert from and to HTTP requests and responses.
-
用于实现request到response之间数据互转的接口
*/
public interface HttpMessageConverter {}
==================================================================
-
RequestMappingHandlerAdapter是针对我们controller层中@RequestMapping注解的方法。关于springmvc的执行流程我们之前也有梳理过。RequestMappingHandlerAdapter是mvc中HandlerAdapter最经典的一类。他所承载的如何通过请求定位方法且进行方法入参和出参的格式转换。
-
HandlerAdapter中有个handle方法,源码中翻译过来就是request请求入口函数。
- 其中重点就在RequestMappingHandlerAdapter的invokeHandlerMethod上。
- 我们通过idea断点调试也能够看到controller的调用是从RequestMappingHandlerAdapter的invokeHandlerMethod上开始调用的。
- 最终会在RequestResponseBodyMethodProcessor进行数据返回的拦截。这个类对入参和出参都进行拦截。我这里值断点了他的返回函数。对入参数据的绑定在readWithMessageConverters方法中。而在数据写回过程中是他的父类AbstractMessageConverterMethodProcessor#writeWithMessageConverters起到关键作用。该方法内部会通过注册好的converter进行匹配请求头中的contentType来找到合适的转换器。而关于这个转换器spring在requestMappingHandlerAdapter中默认
public RequestMappingHandlerAdapter() {
this.messageConverters = new ArrayList<>(4);
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
try {
this.messageConverters.add(new SourceHttpMessageConverter<>());
}
catch (Error err) {
// Ignore when no TransformerFactory implementation is available
}
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
}
- 这也对应上了我们mvc章节中提供的扩展
/**
- 定制消息转换器, 控制对象序列化格式
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//converters.clear();
converters.add(getFormHttpMessageConverter());
converters.add(getJsonHttpMessageConverter());
}
- 这样我们就在spring默认的转换器基础上新增了我们的转换器。这里的messageConverters就是我们今天的重点HttpMessageConverter。
================================================================
public abstract class AbstractHttpMessageConverter implements HttpMessageConverter
- springboot中对他进行了抽象。我们自定义的消息转换器大多继承这个抽象类就可以了。
public interface HttpMessageConverter {
/**
- 标识指定class是否可以使用该转换器
*/
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
/**
- 该转换器是否支持将该class写出
*/
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
/**
- 该转换器支持的请求头设置的mediaType
*/
List getSupportedMediaTypes();
/**
- 从输入字节流中读取出指定class的数据
*/
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;
/**
- 将指定class的数据输出到字节流中
*/
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
}
====================================================================================
- 上面提到请求最终会落在RequestMappingHandlerAdapter的invokeHandlerMethod上。这个方法就是根据parameter和类对象决定使用具体哪一个HandlerMethodArgumentResolver来执行数据的解析工作。
@Nullable
private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

感受:
其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。
特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。
也祝愿各位同学,都能找到自己心动的offer。
分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
也祝愿各位同学,都能找到自己心动的offer。
分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档
[外链图片转存中…(img-PC4WRmK4-1713744809338)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!