当在配置文件中如:spring-mvc.xml使用<mvc:annotation-driven/>时,我们知道springmvc会通过AnnotationDrivenBeanDefinitionParser来加载一些默认的bean,这些bean用来处理我们的请求。其中就包括本章节要说的 HttpMessageConverter。
什么是 HttpMessageConverter?
先看一下官网api的说明:
Strategy interface that specifies a converter that can convert from and to HTTP requests and responses. 意思为:它是一个接口,可以用来转换来自http的request或者发送到http的response中的内容 |
既然是一个接口,那么就要有实现类,看下图:
上面这么多,默认会放到容器中的会有下面这些:
如果想自定义一些HttpMessageConverter放到容器中,需要在配置文件中自己来声明,这个会在稍后给出例子。
什么时候被调用?
下面我们以你在controller中使用了@ReqeustMapping为例,来看一下HttpMessageConverter是什么时候被调用的
当我们在浏览器发起请求后,DispatcherServlet便会通过doDispatch来处理请求,我们之前的文章介绍过,在doDispatch中通过选择一个handlerApdater来调用具体处理请求的方法(也就是controller中的方法),
当我们的adatper调用handler(controller)中的方法执行结束返回时,便会选择一个合适的HttpMessageConverter将方法返回值转换为一个格式返回给浏览器。具体的方法调用顺序如下:
下面通过一个例子,来详细看一下到底是怎么做的?
我们发起一个请求,然后返回hello字符串,如下图:
当发起请求后,会调用到controller中处理请求的方法,方法会返回一个hello字符串,然后便会调用到如下方法中
这个方法方法中会通过canWrite方法来选择可以处理这个类型的converter,这里的valueClass就是返回值hello的类型。
result里面就是最终符合条件的converter他们出来完返回值,返回给浏览器的Content-Type,如下:
[text/plain, */*, application/json, application/*+json]