Spring MVC 解决日期类型动态绑定问题
2014-08-22 17:06
337 查看
出处:http://www.cnblogs.com/crazy-fox/archive/2012/02/18/2357699.html
ean 名为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。
对于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),具体格式如下
ean 名为User,则在相同的包中存在UserEditor类可实现customer propertyEditor的自动注册。2:利用@InitBinder来注册customer propertyEditor这个在之前的笔记中已经介绍过了,即在controller类中增加一个使用@InitBinder标注的方法,在其中注册customer Editor
@InitBinder initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(); binder.registerCustomEditor(Date., CustomDateEditor( dateFormat, )); }
3:继承 WebBindingInitializer 接口来实现全局注册 使用@InitBinder只能对特定的controller类生效,为注册一个全局的customer Editor,可以实现接口WebBindingInitializer 。
CustomerBinding WebBindingInitializer { @Override initBinder(WebDataBinder binder, WebRequest request) { SimpleDateFormat dateFormat = SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(); binder.registerCustomEditor(Date., CustomDateEditor( dateFormat, )); }
并修改 servlet context xml配置文件
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="webBindingInitializer"> <bean class="net.zhepu.web.customerBinding.CustomerBinding" /> </property> </bean>
但这样一来就无法使用mvc:annotation-driven 了。
使用conversion-service来注册自定义的converter DataBinder实现了PropertyEditorRegistry, TypeConverter这两个interface,而在spring mvc实际处理时,返回值都是return binder.convertIfNecessary(见HandlerMethodInvoker中的具体处理逻辑)。因此可以使用customer conversionService来实现自定义的类型转换。
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="net.zhepu.web.customerBinding.CustomerConverter" /> </list> </property> </bean>
需要修改spring service context xml配置文件中的annotation-driven,增加属性conversion-service指向新增的conversionService bean。
<mvc:annotation-driven validator="validator" conversion-service="conversionService" />实际自定义的converter如下。
CustomerConverter Converter<String, Date> { @Override Date convert(String source) { SimpleDateFormat dateFormat = SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(); { dateFormat.parse(source); } (ParseException e) { e.printStackTrace(); } ; }
对于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),具体格式如下
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/> </mvc:message-converters> </mvc:annotation-driven>
相关文章推荐
- JDBC操作MySQL5日期类型字段的问题解决方法
- 如何在Access中参数化日期类型,以解决Data type mismatch in criteria expression的问题
- 解决mysql 数据库中日期类型00:00:00 的问题 设置xml数据类型:java.util.Date
- 解决用<img src="<%# Eval("ShowPhoto")%>"动态绑定图片,发布到IIS上无法显示的问题
- 完美解决json循环问题(使用javassist增强):Spring MVC中使用jackson的MixInAnnotations方法动态过滤JSON字段
- spring mvc表单数据绑定,对于基本类型和日期的处理WebDataBinder
- 基于Converter解决Struts无法处理日期类型的问题
- 解决mysql 数据库中日期类型00:00:00 的问题 设置xml数据类型:java.util.Date
- 解决Proxy.newProxyInstance创建动态代理导致类型转换错误的问题
- 基于Converter解决Struts无法处理日期类型的问题
- 遇到动态调用Parameters .AddWithValue()参数类型问题的解决方法
- 基于Converter解决Struts无法处理日期类型的问题
- 解决 JScript 中使用日期类型数据时出现类型错误的问题
- 关于innerHTML后丢失动态绑定的EVENT问题解决方法
- updatepanel中动态生成组件及绑定事件问题的解决
- 关于Silverlight对匿名类型数据绑定的问题及其解决方法
- 关于Silverlight对匿名类型数据绑定的问题及其解决方法
- 如何在Access中参数化日期类型,以解决Data type mismatch in criteria expression的问题
- 解决 JScript 中使用日期类型数据时出现类型错误的问题
- sqlite查询日期类型数据时出现问题的解决方法