RequestResponseBodyMethodProcessor的supportsReturnType方法:
然后使用handleReturnValue方法进行处理:
我们看到,这里使用了转换器。 具体的转换方法:
至于为何是请求头部的Accept数据,读者可以进去debug这个getAcceptableMediaTypes方法看看。 我就不罗嗦了~~~
ok。至此,我们走遍了所有的流程。
现在,回过头来看。为什么一开始的demo输出了json数据? 我们来分析吧。
由于我们只配置了
很明显,我们看到了2个要看能不能转换,得看HttpMessageConverter接口的public boolean canWrite(Class> clazz, MediaType mediaType)方法是否返回true来决定的。
我们先分析SourceHttpMessageConverter:
它的canWrite方法被父类AbstractHttpMessageConverter重写了。
发现SUPPORTED_CLASSES中没有Map类(本文demo返回的是Map类),因此不支持。 下面看Jaxb2RootElementHttpMessageConverter: 这个类直接重写了canWrite方法。
需要有
最终MappingJackson2HttpMessageConverter匹配,进行json转换。(为何匹配,请读者自行查看源码)
实例讲解
我们分析了转换器的转换过程之后,下面就通过实例来验证我们的结论吧。 首先,我们先把
之前已经分析,默认的转换器中是支持
由于Map是jdk源码中的部分,因此我们用Employee来做demo。 因此,Controller加上一个方法:
@RequestMapping(\
实体中加上@
结果如下:
我们发现,解析成了 这里为什么解析成
之前分析过,消息转换器是根据class和mediaType决定的。 我们使用firebug看到:
我们发现Accept有
我们再来验证,同一地址,HTTP头部不同Accept。看是否正确。
$.ajax({ url: \{ console.log(res); }, headers: { \