RequestMappingHandlerAdapter配置

RequestMappingHandlerAdapter配置

 190045_JRWI_229733.jpg

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

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

List<HttpMessageConverter<?>>

initBinderArgumentResolvers

@InitBinder注解的方法的参数解析器

个性化配置每个请求的WebDataBinder

contentNegotiationManager

内容协商管理器 用于决定media type

处理ajax特殊情况时可能会用到

synchronizeOnSession

是否在执行时同步session,从而保证该会话的用户串行访问该控制器。

等等其他一些属性

 

 customArgumentResolvers

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

 190443_r2uh_229733.jpg

用法:

190612_g6VH_229733.jpg

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

 

使用到自定义解析器: 190707_QzgP_229733.jpg

webBindingInitializer

webBindingInitializer

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

 

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

 

springWebBindingInitializer提供了一个便捷的实现类用来配置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提供配置项

190748_GZBg_229733.jpg

 

 

其中类型转换有2种方式:1PropertyEditor2ConversionService;

在这个类方法里可以看到

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()方法,里面注册的转换器有基本数据类型和常用类,可以另外注册覆盖默认配置。

 190832_Ka2P_229733.jpg

 

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

 190918_U1ys_229733.jpg

 

messageConverters

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

 

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

 

常用到的2HttpMessageConverter:

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

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

 190952_NPIm_229733.jpg 

 

191014_sS4W_229733.jpg

 

参考材料

说说Spring里的WebDataBinder : http://www.cnblogs.com/AloneSword/p/3998943.html

spring数据类型转换:http://www.iteye.com/topic/1123319

 

感觉在过API

 

 

转载于:https://my.oschina.net/braveCS/blog/625506

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值