Servlet中的输入参数为都是string类型,而spring mvc通过data bind机制将这些string
类型的输入参数转换为相应的command object(根据view和controller之间传输数据的具体逻辑,也可称为model
attributes, domain model
objects)。在这个转换过程中,spring实际是先利用java.beans.PropertyEditor中的
setAdText方法来把string格式的输入转换为bean属性,
亦可通过继承java.beans.PropertyEditorSupport来实现自定义的PropertyEditors,具体实现方式可 参考spring reference 3.0.5 第 5.4节中的 Registering additional custom PropertyEditors部分。 自定义完毕propertyEditor后,有以下几种方式来注册自定义的customer propertyEditor. 1:直接将自定义的propertyEditor放到需要处理的java bean相同的目录下 名称和java Bean相同但后面带Editor后缀。 例如需要转换的java bean 名为User,则在相同的包中存在UserEditor类可实现customer propertyEditor的自动注册。 2:利用@InitBinder来注册customer propertyEditor 这个在之前的笔记中已经介绍过了,即在controller类中增加一个使用@InitBinder标注的方法,在其中注册customer Editor
3:继承 WebBindingInitializer 接口来实现全局注册 使用@InitBinder只能对特定的controller类生效,为注册一个全局的customer Editor,可以实现接口WebBindingInitializer 。
并修改 servlet context xml配置文件
但这样一来就无法使用mvc:annotation-driven 了。 使用conversion-service来注册自定义的converter DataBinder实现了PropertyEditorRegistry, TypeConverter这两个interface,而在spring mvc实际处理时,返回值都是return binder.convertIfNecessary(见HandlerMethodInvoker中的具体处理逻辑)。因此可以使用customer conversionService来实现自定义的类型转换。
需要修改spring service context xml配置文件中的annotation-driven,增加属性conversion-service指向新增的conversionService bean。
实际自定义的converter如下。
对于requestBody或httpEntity中数据的类型转换 Spring MVC中对于requestBody中发送的数据转换不是通过databind来实现,而是使用HttpMessageConverter来实现具体的类型转换。 例如,之前提到的json格式的输入,在将json格式的输入转换为具体的model的过程中,spring mvc首先找出request header中的contenttype,再遍历当前所注册的所有的HttpMessageConverter子类, 根据子类中的canRead()方法来决定调用哪个具体的子类来实现对requestBody中的数据的解析。如果当前所注册的 httpMessageConverter中都无法解析对应contexttype类型,则抛出 HttpMediaTypeNotSupportedException (http 415错误)。 那么需要如何注册自定义的messageConverter呢,很不幸,在spring 3.0.5中如果使用annotation-driven的配置方式的话,无法实现自定义的messageConverter的配置,必须老老实实的自己 定义AnnotationMethodHandlerAdapter的bean定义,再设置其messageConverters以注册自定义的 messageConverter。 在3.1版本中,将增加annotation-driven对自定义的messageConverter的支持 (SPR-7504),具体格式如下
3 顶 0 踩 如果是和Spring Security 一起使用,Bean的Id千万不能叫“conversionService”,估计是Security里面用了这个Id,会导致Security 无法初始化。
|
|