您的位置:首页 > 编程语言 > Java开发

springMVC ArgumentResolvers 与ReturnValueHandlers

2015-12-08 15:02 405 查看

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

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

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

加载默认ArgumentResolvers

//RequestMappingHandlerAdapter初始化ArgumentResolvers
private 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 初始化returnValueHandlers
private 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

//请求进来获取类型转换适配器
//HandlerMethodArgumentResolverComposite
private 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;
}
/**
a
4000
rgumentResolvers中的对象
[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

//HandlerMethodReturnValueHandlerComposite
private 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@48416524
org.springframework.web.method.annotation.ModelMethodProcessor@3d57438b
org.springframework.web.servlet.mvc.method.annotation.ViewMethodReturnValueHandler@2c137a23
org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor@32b7a670
org.springframework.web.servlet.mvc.method.annotation.CallableMethodReturnValueHandler@37101d13
org.springframework.web.servlet.mvc.method.annotation.DeferredResultMethodReturnValueHandler@2e4e6a3
org.springframework.web.servlet.mvc.method.annotation.AsyncTaskMethodReturnValueHandler@1e1d8d1
org.springframework.web.method.annotation.ModelAttributeMethodProcessor@1261824e
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor@3fb1d84f
org.springframework.web.servlet.mvc.method.annotation.ViewNameMethodReturnValueHandler@34f04b34
org.springframework.web.method.annotation.MapMethodProcessor@fc84a09
zc.test.resolver.MyRequestResponseBodyMethodProcessor@bd95e13
org.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java spring mvc