spring 添加controller返回值绑定
@EnableWebMvc @Configuration public class Config { @Autowired private RequestMappingHandlerAdapter handlerAdapter; @PostConstruct public void init() { List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(handlerAdapter.getReturnValueHandlers()); List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); messageConverters.add(new MappingJackson2HttpMessageConverter()); handlers.add(0, new ResultResponseHandlerMethodProcessor(messageConverters)); handlerAdapter.setReturnValueHandlers(handlers); handlerAdapter.getCustomReturnValueHandlers().add(0, new ResultResponseHandlerMethodProcessor(messageConverters)); handlerAdapter.afterPropertiesSet(); } }
public class ResultResponseHandlerMethodProcessor extends RequestResponseBodyMethodProcessor { public ResultResponseHandlerMethodProcessor(List<HttpMessageConverter<?>> messageConverters) { super(messageConverters); } public ResultResponseHandlerMethodProcessor(List<HttpMessageConverter<?>> messageConverters, ContentNegotiationManager contentNegotiationManager) { super(messageConverters, contentNegotiationManager); } @Override public boolean supportsReturnType(final MethodParameter returnType) { return returnType.getParameterType() == ResponseResult.class; } @Override public void handleReturnValue(final Object returnValue, final MethodParameter returnType, final ModelAndViewContainer mavContainer, final NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException { super.handleReturnValue(returnValue, returnType, mavContainer, webRequest); } }
spring相关核心类: org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons org.springframework.context.support.AbstractApplicationContext#refresh mvcUriComponentsContributor spring bean容器 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#injectionMetadataCache org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.CompositeUriComponentsContributorFactoryBean