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