Spring MVC @ResponseBody返回Json
2016-07-19 09:08
183 查看
http://www.chawenti.com/articles/23596.html入口是MvcNamespaceHandler,注册了这个AnnotationDrivenBeanDefinitionParser解析器,在getMessageConverters方法最后
如果我们加入了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得到结果
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得到结果
相关文章推荐
- Spring Security学习
- java为什么要实例化?实例化的对象和引用...
- 【转-整理】Struts2中package,action,result,method配置详解
- Java中BitSet的实现
- 修改EAS指定的JAVA_HOME
- java线程同步辅助类的使用CountDownLatch
- spring源码分析之定时任务概述
- Hadoop--04--使用java api操作
- Java中的IO流系统详解
- Thinking in Java 第16章 数组
- java泛型(转)
- 第1条:使用静态工厂的方法来代替构造器
- java守护线程与非守护线程(转)
- JAVA中HashMap和Hashtable区别(转)
- java 垃圾回收机制(转)
- Spring系列之IOC
- Java内存结构
- Java日期时间(Date/Time):DateFormat格式代码
- static(静态)关键字的特点和用法
- Java中IO流常见的几种流