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 }