springMVC ArgumentResolvers 与ReturnValueHandlers
2015-12-08 15:02
405 查看
springMVC ArgumentResolvers 与ReturnValueHandlers 方法参数处理返回值处理
自定义扩展springMVC神奇的方法参数与返回值处理requestMappingHandlerAdapter 初始化默认的参数适配器
加载默认ArgumentResolvers
//RequestMappingHandlerAdapter初始化ArgumentResolvers private 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 初始化returnValueHandlers private 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
//请求进来获取类型转换适配器 //HandlerMethodArgumentResolverComposite private 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; } /** a 4000 rgumentResolvers中的对象 [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
//HandlerMethodReturnValueHandlerComposite private 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@48416524 org.springframework.web.method.annotation.ModelMethodProcessor@3d57438b org.springframework.web.servlet.mvc.method.annotation.ViewMethodReturnValueHandler@2c137a23 org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor@32b7a670 org.springframework.web.servlet.mvc.method.annotation.CallableMethodReturnValueHandler@37101d13 org.springframework.web.servlet.mvc.method.annotation.DeferredResultMethodReturnValueHandler@2e4e6a3 org.springframework.web.servlet.mvc.method.annotation.AsyncTaskMethodReturnValueHandler@1e1d8d1 org.springframework.web.method.annotation.ModelAttributeMethodProcessor@1261824e org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor@3fb1d84f org.springframework.web.servlet.mvc.method.annotation.ViewNameMethodReturnValueHandler@34f04b34 org.springframework.web.method.annotation.MapMethodProcessor@fc84a09 zc.test.resolver.MyRequestResponseBodyMethodProcessor@bd95e13 org.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
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统