springMVC ArgumentResolvers 与ReturnValueHandlers
来源:互联网 发布:mysql my.ini 编码 编辑:程序博客网 时间:2024/06/08 10:13
springMVC ArgumentResolvers 与ReturnValueHandlers 方法参数处理返回值处理
自定义扩展springMVC神奇的方法参数与返回值处理
requestMappingHandlerAdapter 初始化默认的参数适配器
加载默认ArgumentResolvers
//RequestMappingHandlerAdapter初始化ArgumentResolversprivate List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() { List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>(); // Annotation-based argument resolution resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false)); resolvers.add(new RequestParamMapMethodArgumentResolver()); resolvers.add(new PathVariableMethodArgumentResolver()); resolvers.add(new PathVariableMapMethodArgumentResolver()); resolvers.add(new MatrixVariableMethodArgumentResolver()); resolvers.add(new MatrixVariableMapMethodArgumentResolver()); resolvers.add(new ServletModelAttributeMethodProcessor(false)); resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters())); resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters())); resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory())); resolvers.add(new RequestHeaderMapMethodArgumentResolver()); resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory())); resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory())); // Type-based argument resolution resolvers.add(new ServletRequestMethodArgumentResolver()); resolvers.add(new ServletResponseMethodArgumentResolver()); resolvers.add(new HttpEntityMethodProcessor(getMessageConverters())); resolvers.add(new RedirectAttributesMethodArgumentResolver()); resolvers.add(new ModelMethodProcessor()); resolvers.add(new MapMethodProcessor()); resolvers.add(new ErrorsMethodArgumentResolver()); resolvers.add(new SessionStatusMethodArgumentResolver()); resolvers.add(new UriComponentsBuilderMethodArgumentResolver()); // Custom arguments //自定义ArgumentResolvers if (getCustomArgumentResolvers() != null) { resolvers.addAll(getCustomArgumentResolvers()); } // Catch-all resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true)); resolvers.add(new ServletModelAttributeMethodProcessor(true)); return resolvers; }
加载默认化returnValueHandlers
//RequestMappingHandlerAdapter 初始化returnValueHandlersprivate List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() { List<HandlerMethodReturnValueHandler> handlers = new ArrayList<HandlerMethodReturnValueHandler>(); // Single-purpose return value types handlers.add(new ModelAndViewMethodReturnValueHandler()); handlers.add(new ModelMethodProcessor()); handlers.add(new ViewMethodReturnValueHandler()); handlers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.contentNegotiationManager)); handlers.add(new CallableMethodReturnValueHandler()); handlers.add(new DeferredResultMethodReturnValueHandler()); handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory));// Annotation-based return value types handlers.add(new ModelAttributeMethodProcessor(false)); handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.contentNegotiationManager)); // Multi-purpose return value types handlers.add(new ViewNameMethodReturnValueHandler()); handlers.add(new MapMethodProcessor()); // Custom return value types //自定义的returnValueHandler if (getCustomReturnValueHandlers() != null) { handlers.addAll(getCustomReturnValueHandlers()); } // Catch-all if (!CollectionUtils.isEmpty(getModelAndViewResolvers())) { handlers.add(new ModelAndViewResolverMethodReturnValueHandler(getModelAndViewResolvers())); } else { handlers.add(new ModelAttributeMethodProcessor(true)); } return handlers; }
请求进来获取类型转换适配器 HandlerMethodArgumentResolverComposite
//请求进来获取类型转换适配器//HandlerMethodArgumentResolverCompositeprivate HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) { HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter); if (result == null) { for (HandlerMethodArgumentResolver methodArgumentResolver : this.argumentResolvers) { if (methodArgumentResolver.supportsParameter(parameter)) { result = methodArgumentResolver; this.argumentResolverCache.put(parameter, result); break; } } } return result; }/**argumentResolvers中的对象[org.springframework.web.method.annotation.RequestParamMethodArgumentResolver@15126b00, org.springframework.web.method.annotation.RequestParamMapMethodArgumentResolver@6c2ed7ce, org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver@775a4cde, org.springframework.web.servlet.mvc.method.annotation.PathVariableMapMethodArgumentResolver@496cc009, org.springframework.web.servlet.mvc.method.annotation.MatrixVariableMethodArgumentResolver@2b3b488, org.springframework.web.servlet.mvc.method.annotation.MatrixVariableMapMethodArgumentResolver@64114e1a, org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor@2c1ec049, org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor@16e20f40, org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver@53573e7c, org.springframework.web.method.annotation.RequestHeaderMethodArgumentResolver@4c769a3, org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver@3fe84ec8, org.springframework.web.servlet.mvc.method.annotation.ServletCookieValueMethodArgumentResolver@2c8c4d3f, org.springframework.web.method.annotation.ExpressionValueMethodArgumentResolver@2f2379f2, org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver@421b170b, org.springframework.web.servlet.mvc.method.annotation.ServletResponseMethodArgumentResolver@85f515, org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor@5a9d35f7, org.springframework.web.servlet.mvc.method.annotation.RedirectAttributesMethodArgumentResolver@742199b, org.springframework.web.method.annotation.ModelMethodProcessor@49f12d6, org.springframework.web.method.annotation.MapMethodProcessor@678da1f8, org.springframework.web.method.annotation.ErrorsMethodArgumentResolver@384d5e5, org.springframework.web.method.annotation.SessionStatusMethodArgumentResolver@5f6af31, org.springframework.web.servlet.mvc.method.annotation.UriComponentsBuilderMethodArgumentResolver@667bd06, zc.test.resolver.MyMethodArgumentsResolver@4aad833, org.springframework.web.method.annotation.RequestParamMethodArgumentResolver@6c57fea9, org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor@51040d1]*/
RequestMappingHandlerAdapter处理完成后,从HandlerMethodReturnValueHandlerComposite获取returnValueHandler
//HandlerMethodReturnValueHandlerCompositeprivate HandlerMethodReturnValueHandler getReturnValueHandler(MethodParameter returnType) { //list顺序检查是否支持处理返回类型 for (HandlerMethodReturnValueHandler returnValueHandler : returnValueHandlers) { //...... if (returnValueHandler.supportsReturnType(returnType)) { return returnValueHandler; } } return null; }/**returnValueHandlers 中的对象org.springframework.web.servlet.mvc.method.annotation.ModelAndViewMethodReturnValueHandler@48416524org.springframework.web.method.annotation.ModelMethodProcessor@3d57438borg.springframework.web.servlet.mvc.method.annotation.ViewMethodReturnValueHandler@2c137a23org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor@32b7a670org.springframework.web.servlet.mvc.method.annotation.CallableMethodReturnValueHandler@37101d13org.springframework.web.servlet.mvc.method.annotation.DeferredResultMethodReturnValueHandler@2e4e6a3org.springframework.web.servlet.mvc.method.annotation.AsyncTaskMethodReturnValueHandler@1e1d8d1org.springframework.web.method.annotation.ModelAttributeMethodProcessor@1261824eorg.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor@3fb1d84forg.springframework.web.servlet.mvc.method.annotation.ViewNameMethodReturnValueHandler@34f04b34org.springframework.web.method.annotation.MapMethodProcessor@fc84a09zc.test.resolver.MyRequestResponseBodyMethodProcessor@bd95e13org.springframework.web.method.annotation.ModelAttributeMethodProcessor@6baf3778*/
自定义转换器时候需注意
- Map类型入参、返回时会被MapMethodProcessor处理
- json是继承Map的
自定义配置spring-mvc.xml
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"> <mvc:argument-resolvers> <bean class="zc.test.resolver.MyMethodArgumentsResolver"></bean> </mvc:argument-resolvers> <mvc:return-value-handlers> <bean class="zc.test.resolver.MyRequestResponseBodyMethodProcessor"> <constructor-arg> <list> <ref bean="stringHttpMessageConverter" /> <ref bean="mappingJacksonHttpMessageConverter" /> </list> </constructor-arg> </bean> </mvc:return-value-handlers> <mvc:message-converters> <ref bean="stringHttpMessageConverter" /> <ref bean="mappingJacksonHttpMessageConverter" /> </mvc:message-converters> </mvc:annotation-driven>
方法参数实现HandlerMethodArgumentResolver接口
返回值处理继承AbstractMessageConverterMethodProcessor或实现HandlerMethodReturnValueHandler
注解自定义参考RequestBody与ResponsBody
参考
1: http://yingzhuo.iteye.com/blog/2009123
2:http://blog.csdn.net/truong/article/details/30971317
0 0
- springMVC ArgumentResolvers 与ReturnValueHandlers
- FreeMarker与SpringMVC整合
- FreeMarker与SpringMVC整合
- FREEMARKER与SPRINGMVC整合
- freemarker与springmvc整合
- FreeMarker与SpringMVC整合
- SpringMVC与Mybatis集成
- SpringMVC与Ibatis整合
- SpringMVC与struts2比较
- mybatis与SpringMVC集成
- SpringMVC与Hibernate整合
- springMVC与flex 整合
- SpringMVC与Spring集成
- springMVC上传与下载
- SpringMVC与struts2比较
- SpringMVC:上传与下载
- SpringMVC与struts2比较
- springmvc与ejb整合
- 07-图4 哈利波特的考试
- Python+Hadoop Streaming实现MapReduce(word count)
- 语音信号处理之----动态时间规整(DTW)
- linux2.6.32 platform驱动装载过程跟踪
- Java——动态代理
- springMVC ArgumentResolvers 与ReturnValueHandlers
- 纪念,IOS第一次找工作!
- Oracle两表数据相连和计算比率
- Edittext限制输入汉字50英文100
- ios属性修饰符总结
- Sed备忘录
- [LeetCode]021-Merge Two Sorted Lists
- ActionBar的使用(二)
- 网页抓取