您的位置:首页 > 移动开发

RequestMappingHandlerAdapter配置

2016-02-28 00:00 639 查看
摘要: 感觉在过API,当备忘

RequestMappingHandlerAdapter配置



RequestMappingHandlerAdapter:适配@RequestMapping注释的Controller方法处理Http Request请求,返回Response。

RequestMappingHandlerAdapter 主要工作是解析请求参数和处理返回值,处理过程中可配置:

可配置的属性字段
字段说明
备注
argumentResolvers
参数解析器
List<HandlerMethodArgumentResolver>
customArgumentResolvers
自定义参数解析器,排在内置解析器后面
List<HandlerMethodArgumentResolver>
returnValueHandlers
返回值处理器
List<HandlerMethodReturnValueHandler>
CustomReturnValueHandlers
自定义返回值处理器,排在内置处理器后面
List<HandlerMethodReturnValueHandler>
webBindingInitializer
每个WebDataBind的全局初始化器,参数解析器会用WebDataBind进行Bean类字段填充和类型转换,
WebBindingInitializer
messageConverters
参数解析器和返回值处理器中使用到的request和response的body类型转换器HttpMessageConverter
List<HttpMessageConverter<?>>
initBinderArgumentResolvers
@InitBinder注解的方法的参数解析器
个性化配置每个请求的WebDataBinder
contentNegotiationManager
内容协商管理器 用于决定media type
处理ajax特殊情况时可能会用到
synchronizeOnSession
是否在执行时同步session,从而保证该会话的用户串行访问该控制器。
等等其他一些属性
customArgumentResolvers

项目工程里配置的自定义解析器有:CustomSessionArgumentResolver



用法:



获取Session的属性赋值给@CustomSessionArgument注解的对象。

使用到自定义解析器:


webBindingInitializer

webBindingInitializer

是每个WebDataBind的全局初始化器,用来配置WebDataBind。

WebDataBind把request请求里的数据绑定(注入)到Bean类里,包括类型转换、校验和绑定结果分析。

spring给WebBindingInitializer提供了一个便捷的实现类用来配置WebDataBinde:

org.springframework.web.bind.support.ConfigurableWebBindingInitializer,其中配置属性如下:

propertyEditorRegistrars
类型转换,3.0之前方法
PropertyEditorRegistrar[]
conversionService
类型转换,3.0之后的方法
ConversionService
autoGrowNestedPaths
如果注入的值为null,是否注入默认值,默认为true
boolean
bindingErrorProcessor
数据绑定错误处理器
BindingErrorProcessor
directFieldAccess
是否直接使用Field反射注入值,还是用setter注入值,默认为false
boolean
messageCodesResolver
绑定的错误信息生成错误信息编码
MessageCodesResolver
validator
对象校验器
Validator
WebDataBind的可配置属性如下图所示,包含ConfigurableWebBindingInitializer提供配置项



其中类型转换有2种方式:1)PropertyEditor;2)ConversionService;

在这个类方法里可以看到

org.springframework.beans.TypeConverterDelegate.convertIfNecessary(String propertyName, Object oldValue, Object newValue, Class<T> requiredType, TypeDescriptor typeDescriptor)

内部首先查找PropertyEditor进行类型转换,如果没有找到相应的PropertyEditor再通过ConversionService进行转换。

propertyEditorRegistrars

用来注册PropertyEditor。

内部注册的PropertyEditor见:

org.springframework.beans.PropertyEditorRegistrySupport.createDefaultEditors()方法,里面注册的转换器有基本数据类型和常用类,可以另外注册覆盖默认配置。



ConversionService

spring提供一个FormattingConversionServiceFactoryBean来生成ConversionService的实现类DefaultFormattingConversionService用来注册Converter,Formatter以及执行类型转换

FormattingConversionServiceFactoryBean的可配置:

converters
注册Converter
Set<?>,类型可以是Converter, ConverterFactory,
GenericConverter
formatters
注册formatters
Set<?>, 类型可以是Formatter,
AnnotationFormatterFacotry
formatterRegistrars
注册
Converter,
formatters
Set<FormatterRegistrar>
registerDefaultFormatters
是否要注册默认的Formatter
boolean
embeddedValueResolver


messageConverters

参数解析器和返回值处理器中使用到的request和response的body类型转换器HttpMessageConverter。

在使用@RequestBody和@ResponseBody注解时用到,会根据转换类型和mediaType查找最合适的HttpMessageConverter。

常用到的2个HttpMessageConverter:

1)StringHttpMessageConverter:String类型和报文body的转换

2)MappingJackson2HttpMessageConverter: Bean类型或Map类型和报文Body的转换,可以使用ObjectMapper配置具体的转换规则。同意提供了Jackson2ObjectMappingerFactoryBean的FactoryBean来初始化生产者ObjectMapper。具体配置可见:org.codehaus.jackson.map.DeserializationConfig.Feature和org.codehaus.jackson.map.SerializationConfig.Feature





参考材料

说说Spring里的WebDataBinder : http://www.cnblogs.com/AloneSword/p/3998943.html
spring数据类型转换:http://www.iteye.com/topic/1123319

感觉在过API
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: