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 }