無意中發現對于時間字元串轉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