您的位置:首页 > 编程语言 > Java开发

Spring MVC @ResponseBody返回Json

2016-07-19 09:08 183 查看
http://www.chawenti.com/articles/23596.html入口是MvcNamespaceHandler,注册了这个AnnotationDrivenBeanDefinitionParser解析器,在getMessageConverters方法最后
private static final boolean jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()) && ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader());
private static final boolean gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", AnnotationDrivenBeanDefinitionParser.class.getClassLoader());
if(jackson2Present) {
jacksonConverterDef1 = this.createConverterDefinition(MappingJackson2HttpMessageConverter.class, source);
jacksonFactoryDef1 = this.createObjectMapperFactoryDefinition(source);
jacksonConverterDef1.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef1);
messageConverters.add(jacksonConverterDef1);
} else if(gsonPresent) {
messageConverters.add(this.createConverterDefinition(GsonHttpMessageConverter.class, source));
}

如果我们加入了jackson的jar包,就使用jackson,否则如果有Gson,使用Gson,在RequestMappingHandlerAdapter的messageConverters域就存在这个json转换器。所以如果是使用默认的 标签,messageConverters就会有这些

记录几个点

RequestMappingHandlerAdapter#getDefaultArgumentResolvers 方法

resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice));

RequestResponseBodyMethodProcessor是处理@requestBody和@ReponseBody注解的

RequestMappingHandlerAdapter#afterPropertiesSet方法创建了HandlerMethodArgumentResolverComposite然后把上一步的Resolvers添加进去

RequestMappingHandlerAdapter#invokeHandlerMethod方法 创建了ServletInvocableHandlerMethod 

将RequestMappingHandlerAdapter的HandlerMethodArgumentResolverComposite设置到ServletInvocableHandlerMethod里面

委托ServletInvocableHandlerMethod#invokeForRequest

然后ServletInvocableHandlerMethod #getMethodArgumentValues 创建请求的参数(就是给你自动生成controller里面的参数),

遍历HandlerMethodArgumentResolverComposite里面的Resolvers ,

如果有一个HandlerMethodArgumentResolver#supportsParameter支持,使用该resolves#resolveArgument得到结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: