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