?
?
無意中發現對于時間字符串轉Date類,根本不用自己去寫轉換類,spring mvc已經實現了該功能,還是基于注解的,輕松省事,使用 org.springframework.format.support.FormattingConversionServiceFactoryBean
之后,只要在vo里加注解就行了
?
使用時要引入一個類庫joda-time-n.n.jar
?
Java代碼 ?
@DateTimeFormat(pattern="yyyy-MM-dd")??private?Date?dateRangeStart;
@DateTimeFormat(pattern="yyyy-MM-dd") 可將形如1980-0-01的字符串轉換到Date類
@NumberFormat(pattern="#,###.##") 可將形如4,500.00的字符串轉換成long類型
怎么注冊呢?
Java代碼 ?
<bean?id="conversionService"????class="org.springframework.format.support.FormattingConversionServiceFactoryBean">???<mvc:annotation-driven?validator="validator"????????conversion-service="conversionService"?/>????
使用<mvc:annotation-driven /> 的話,默認就啟用FormattingConversionServiceFactoryBean了,所以上面的配置也省了。
但是<mvc:annotation-driven />基本不用,因為總得做些個性化設置,那怎么注冊FormattingConversionServiceFactoryBean給spring mvc呢?
起初我以為得從DefaultAnnotationHandlerMapping入手,后來通過看<mvc:annotation- driven />的解析器AnnotationDrivenBeanDefinitionParser源碼,才發現原來是 AnnotationMethodHandlerAdapter的屬性
Java代碼 ?
RuntimeBeanReference?conversionService?=?getConversionService(element,?source,?parserContext);??RuntimeBeanReference?validator?=?getValidator(element,?source,?parserContext);????RootBeanDefinition?bindingDef?=?new?RootBeanDefinition(ConfigurableWebBindingInitializer.class);??bindingDef.setSource(source);??bindingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);??bindingDef.getPropertyValues().add("conversionService",?conversionService);??bindingDef.getPropertyValues().add("validator",?validator);????RootBeanDefinition?annAdapterDef?=?new?RootBeanDefinition(AnnotationMethodHandlerAdapter.class);??annAdapterDef.setSource(source);??annAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);??annAdapterDef.getPropertyValues().add("webBindingInitializer",?bindingDef);??annAdapterDef.getPropertyValues().add("messageConverters",?getMessageConverters(source));??
getConversionService方法內部
Java代碼 ?
if?(element.hasAttribute("conversion-service"))?{??????return?new?RuntimeBeanReference(element.getAttribute("conversion-service"));??}??else?{??????RootBeanDefinition?conversionDef?=?new?RootBeanDefinition(FormattingConversionServiceFactoryBean.class);??????conversionDef.setSource(source);??????conversionDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);??????String?conversionName?=?parserContext.getReaderContext().registerWithGeneratedName(conversionDef);??????parserContext.registerComponent(new?BeanComponentDefinition(conversionDef,?conversionName));??????return?new?RuntimeBeanReference(conversionName);??}??
原來<mvc:annotation-driven />是這么注冊FormattingConversionServiceFactoryBean的
如果不使用<mvc:annotation-driven />標簽的話,只要配置AnnotationMethodHandlerAdapter的屬性就可以了
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" ><!-- 支持@DateTimeFormat(pattern="yyyy-MM-dd")等注解 2015年7月31日11:07:03 liuyx--><property name="webBindingInitializer"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="conversionService"> <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean> </property> </bean> </property></bean> ?
原文:http://relive123-yahoo-com-cn.iteye.com/blog/1678376
總結
以上是生活随笔為你收集整理的springMVC 前后台日期格式传值解决方式之一(共二) @DateTimeFormat的使用和配置...的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。