Spring HandlerMethodReturnValueHandler源码解析


Spring 4.3.2

Spring的Controller调用业务逻辑返回的Object会经过HandlerMethodReturnValueHandler的转换,接口HandlerMethodReturnValueHandler定义了两个方法

 1 package org.springframework.web.method.support;
 2 
 3 import org.springframework.core.MethodParameter;
 4 import org.springframework.web.context.request.NativeWebRequest;
 5 
 6 public interface HandlerMethodReturnValueHandler {
 7 
 8     boolean supportsReturnType(MethodParameter returnType);
 9 
10     void handleReturnValue(Object returnValue, MethodParameter returnType,
11             ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;
12 
13 }

当supportsReturnType返回true时会调用handleReturnValue转换

源代码如下org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite

1 private HandlerMethodReturnValueHandler getReturnValueHandler(MethodParameter returnType) {
2         for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
3             if (handler.supportsReturnType(returnType)) {
4                 return handler;
5             }
6         }
7         return null;
8     }

默认有15个实现HandlerMethodReturnValueHandler的类,在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter中添加

源代码如下

注释是HandlerMethodReturnValueHandler处理的返回值类型

 1 private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {
 2         List<HandlerMethodReturnValueHandler> handlers = new ArrayList<HandlerMethodReturnValueHandler>();
 3 
 4         // Single-purpose return value types
 5         handlers.add(new ModelAndViewMethodReturnValueHandler()); // 处理返回类型ModelAndView
 6         handlers.add(new ModelMethodProcessor()); // 处理返回类型Model
 7         handlers.add(new ViewMethodReturnValueHandler()); // 处理返回类型View
 8         handlers.add(new ResponseBodyEmitterReturnValueHandler(getMessageConverters())); // 处理返回类型 ?
 9         handlers.add(new StreamingResponseBodyReturnValueHandler()); // 处理返回类型StreamingResponseBody
10         handlers.add(new HttpEntityMethodProcessor(getMessageConverters(), // 处理返回类型HttpEntity|RequestEntity
11                 this.contentNegotiationManager, this.requestResponseBodyAdvice));
12         handlers.add(new HttpHeadersReturnValueHandler()); // 处理返回类型HttpHeaders
13         handlers.add(new CallableMethodReturnValueHandler()); // 处理返回类型Callable
14         handlers.add(new DeferredResultMethodReturnValueHandler()); // 处理返回类型DeferredRequest | ListenableFuture
15         handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory)); // 处理返回类型WebAsyncTask
16 
17         // Annotation-based return value types
18         handlers.add(new ModelAttributeMethodProcessor(false)); //处理@ModelAttribute
19         handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), // 处理@ResponseBody
20                 this.contentNegotiationManager, this.requestResponseBodyAdvice));
21 
22         // Multi-purpose return value types
23         handlers.add(new ViewNameMethodReturnValueHandler()); // 处理返回类型Void.class | CharSequense.class
24         handlers.add(new MapMethodProcessor()); // 处理返回类型Map
25 
26         // Custom return value types
27         if (getCustomReturnValueHandlers() != null) {
28             handlers.addAll(getCustomReturnValueHandlers()); // 自定义
29         }
30 
31         // Catch-all
32         if (!CollectionUtils.isEmpty(getModelAndViewResolvers())) {
33             handlers.add(new ModelAndViewResolverMethodReturnValueHandler(getModelAndViewResolvers()));
34         }
35         else {
36             handlers.add(new ModelAttributeMethodProcessor(true)); // 处理返回类型ModelAttribute | 普通类型
37         }
38 
39         return handlers;
40     }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM