2019独角兽企业重金招聘Python工程师标准>>>
RequestMappingHandlerAdapter配置
RequestMappingHandlerAdapter:适配@RequestMapping注释的Controller方法处理Http Request请求,返回Response。
RequestMappingHandlerAdapter 主要工作是解析请求参数和处理返回值,处理过程中可配置:
可配置的属性字段 |
字段说明 |
备注 |
argumentResolvers |
参数解析器 |
List |
customArgumentResolvers |
自定义参数解析器,排在内置解析器后面 |
List |
returnValueHandlers |
返回值处理器 |
List |
CustomReturnValueHandlers |
自定义返回值处理器,排在内置处理器后面 |
List |
webBindingInitializer |
每个WebDataBind的全局初始化器,参数解析器会用WebDataBind进行Bean类字段填充和类型转换, |
WebBindingInitializer |
messageConverters |
参数解析器和返回值处理器中使用到的request和response的body类型转换器HttpMessageConverter |
List |
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 |
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