springMVC ArgumentResolvers 与ReturnValueHandlers

来源:互联网 发布:mysql my.ini 编码 编辑:程序博客网 时间:2024/06/08 10:13

springMVC ArgumentResolvers 与ReturnValueHandlers 方法参数处理返回值处理


自定义扩展springMVC神奇的方法参数与返回值处理

requestMappingHandlerAdapter 初始化默认的参数适配器

加载默认ArgumentResolvers

//RequestMappingHandlerAdapter初始化ArgumentResolversprivate List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {        List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();        // Annotation-based argument resolution        resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));        resolvers.add(new RequestParamMapMethodArgumentResolver());        resolvers.add(new PathVariableMethodArgumentResolver());        resolvers.add(new PathVariableMapMethodArgumentResolver());        resolvers.add(new MatrixVariableMethodArgumentResolver());        resolvers.add(new MatrixVariableMapMethodArgumentResolver());        resolvers.add(new ServletModelAttributeMethodProcessor(false));        resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters()));        resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters()));        resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));        resolvers.add(new RequestHeaderMapMethodArgumentResolver());        resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));        resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));        // Type-based argument resolution        resolvers.add(new ServletRequestMethodArgumentResolver());        resolvers.add(new ServletResponseMethodArgumentResolver());        resolvers.add(new HttpEntityMethodProcessor(getMessageConverters()));        resolvers.add(new RedirectAttributesMethodArgumentResolver());        resolvers.add(new ModelMethodProcessor());        resolvers.add(new MapMethodProcessor());        resolvers.add(new ErrorsMethodArgumentResolver());        resolvers.add(new SessionStatusMethodArgumentResolver());        resolvers.add(new UriComponentsBuilderMethodArgumentResolver());        // Custom arguments        //自定义ArgumentResolvers        if (getCustomArgumentResolvers() != null) {            resolvers.addAll(getCustomArgumentResolvers());        }        // Catch-all        resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));        resolvers.add(new ServletModelAttributeMethodProcessor(true));        return resolvers;    }

加载默认化returnValueHandlers

//RequestMappingHandlerAdapter 初始化returnValueHandlersprivate List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {        List<HandlerMethodReturnValueHandler> handlers = new ArrayList<HandlerMethodReturnValueHandler>();        // Single-purpose return value types        handlers.add(new ModelAndViewMethodReturnValueHandler());        handlers.add(new ModelMethodProcessor());        handlers.add(new ViewMethodReturnValueHandler());        handlers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.contentNegotiationManager));        handlers.add(new CallableMethodReturnValueHandler());        handlers.add(new DeferredResultMethodReturnValueHandler());        handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory));// Annotation-based return value types        handlers.add(new ModelAttributeMethodProcessor(false));        handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.contentNegotiationManager));        // Multi-purpose return value types        handlers.add(new ViewNameMethodReturnValueHandler());        handlers.add(new MapMethodProcessor());        // Custom return value types        //自定义的returnValueHandler        if (getCustomReturnValueHandlers() != null) {            handlers.addAll(getCustomReturnValueHandlers());        }        // Catch-all        if (!CollectionUtils.isEmpty(getModelAndViewResolvers())) {            handlers.add(new ModelAndViewResolverMethodReturnValueHandler(getModelAndViewResolvers()));        }        else {            handlers.add(new ModelAttributeMethodProcessor(true));        }        return handlers;    }

请求进来获取类型转换适配器 HandlerMethodArgumentResolverComposite

//请求进来获取类型转换适配器//HandlerMethodArgumentResolverCompositeprivate HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {        HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);        if (result == null) {            for (HandlerMethodArgumentResolver methodArgumentResolver : this.argumentResolvers) {                if (methodArgumentResolver.supportsParameter(parameter)) {                    result = methodArgumentResolver;                    this.argumentResolverCache.put(parameter, result);                    break;                }            }        }        return result;    }/**argumentResolvers中的对象[org.springframework.web.method.annotation.RequestParamMethodArgumentResolver@15126b00, org.springframework.web.method.annotation.RequestParamMapMethodArgumentResolver@6c2ed7ce, org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver@775a4cde, org.springframework.web.servlet.mvc.method.annotation.PathVariableMapMethodArgumentResolver@496cc009, org.springframework.web.servlet.mvc.method.annotation.MatrixVariableMethodArgumentResolver@2b3b488, org.springframework.web.servlet.mvc.method.annotation.MatrixVariableMapMethodArgumentResolver@64114e1a, org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor@2c1ec049, org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor@16e20f40, org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver@53573e7c, org.springframework.web.method.annotation.RequestHeaderMethodArgumentResolver@4c769a3, org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver@3fe84ec8, org.springframework.web.servlet.mvc.method.annotation.ServletCookieValueMethodArgumentResolver@2c8c4d3f, org.springframework.web.method.annotation.ExpressionValueMethodArgumentResolver@2f2379f2, org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver@421b170b, org.springframework.web.servlet.mvc.method.annotation.ServletResponseMethodArgumentResolver@85f515, org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor@5a9d35f7, org.springframework.web.servlet.mvc.method.annotation.RedirectAttributesMethodArgumentResolver@742199b, org.springframework.web.method.annotation.ModelMethodProcessor@49f12d6, org.springframework.web.method.annotation.MapMethodProcessor@678da1f8, org.springframework.web.method.annotation.ErrorsMethodArgumentResolver@384d5e5, org.springframework.web.method.annotation.SessionStatusMethodArgumentResolver@5f6af31, org.springframework.web.servlet.mvc.method.annotation.UriComponentsBuilderMethodArgumentResolver@667bd06, zc.test.resolver.MyMethodArgumentsResolver@4aad833, org.springframework.web.method.annotation.RequestParamMethodArgumentResolver@6c57fea9, org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor@51040d1]*/

RequestMappingHandlerAdapter处理完成后,从HandlerMethodReturnValueHandlerComposite获取returnValueHandler

//HandlerMethodReturnValueHandlerCompositeprivate HandlerMethodReturnValueHandler getReturnValueHandler(MethodParameter returnType) {        //list顺序检查是否支持处理返回类型        for (HandlerMethodReturnValueHandler returnValueHandler : returnValueHandlers) {            //......            if (returnValueHandler.supportsReturnType(returnType)) {                return returnValueHandler;            }        }        return null;    }/**returnValueHandlers 中的对象org.springframework.web.servlet.mvc.method.annotation.ModelAndViewMethodReturnValueHandler@48416524org.springframework.web.method.annotation.ModelMethodProcessor@3d57438borg.springframework.web.servlet.mvc.method.annotation.ViewMethodReturnValueHandler@2c137a23org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor@32b7a670org.springframework.web.servlet.mvc.method.annotation.CallableMethodReturnValueHandler@37101d13org.springframework.web.servlet.mvc.method.annotation.DeferredResultMethodReturnValueHandler@2e4e6a3org.springframework.web.servlet.mvc.method.annotation.AsyncTaskMethodReturnValueHandler@1e1d8d1org.springframework.web.method.annotation.ModelAttributeMethodProcessor@1261824eorg.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor@3fb1d84forg.springframework.web.servlet.mvc.method.annotation.ViewNameMethodReturnValueHandler@34f04b34org.springframework.web.method.annotation.MapMethodProcessor@fc84a09zc.test.resolver.MyRequestResponseBodyMethodProcessor@bd95e13org.springframework.web.method.annotation.ModelAttributeMethodProcessor@6baf3778*/

自定义转换器时候需注意

  • Map类型入参、返回时会被MapMethodProcessor处理
  • json是继承Map的

自定义配置spring-mvc.xml

<mvc:annotation-driven        content-negotiation-manager="contentNegotiationManager">        <mvc:argument-resolvers>            <bean class="zc.test.resolver.MyMethodArgumentsResolver"></bean>        </mvc:argument-resolvers>        <mvc:return-value-handlers>            <bean class="zc.test.resolver.MyRequestResponseBodyMethodProcessor">                <constructor-arg>                    <list>                        <ref bean="stringHttpMessageConverter" />                        <ref bean="mappingJacksonHttpMessageConverter" />                    </list>                </constructor-arg>            </bean>        </mvc:return-value-handlers>        <mvc:message-converters>            <ref bean="stringHttpMessageConverter" />            <ref bean="mappingJacksonHttpMessageConverter" />        </mvc:message-converters>    </mvc:annotation-driven>

方法参数实现HandlerMethodArgumentResolver接口
返回值处理继承AbstractMessageConverterMethodProcessor或实现HandlerMethodReturnValueHandler

注解自定义参考RequestBody与ResponsBody


参考
1: http://yingzhuo.iteye.com/blog/2009123
2:http://blog.csdn.net/truong/article/details/30971317

0 0
原创粉丝点击