天天看點

springMVC 前背景日期格式傳值解決方式之一(共二) @DateTimeFormat的使用和配置...

無意中發現對于時間字元串轉Date類,根本不用自己去寫轉換類,spring mvc已經實作了該功能,還是基于注解的,輕松省事,使用 org.springframework.format.support.FormattingConversionServiceFactoryBean

之後,隻要在vo裡加注解就行了

使用時要引入一個類庫joda-time-n.n.jar

Java代碼  

springMVC 前背景日期格式傳值解決方式之一(共二) @DateTimeFormat的使用和配置...
  1. @DateTimeFormat(pattern="yyyy-MM-dd")  
  2. private Date dateRangeStart;// 通行日期範圍開始  

@DateTimeFormat(pattern="yyyy-MM-dd") 可将形如1980-0-01的字元串轉換到Date類

@NumberFormat(pattern="#,###.##") 可将形如4,500.00的字元串轉換成long類型

怎麼注冊呢?

Java代碼  

springMVC 前背景日期格式傳值解決方式之一(共二) @DateTimeFormat的使用和配置...
  1. <bean id="conversionService"    
  2. class="org.springframework.format.support.FormattingConversionServiceFactoryBean">   
  3. <mvc:annotation-driven validator="validator"    
  4.     conversion-service="conversionService" />    

使用<mvc:annotation-driven /> 的話,預設就啟用FormattingConversionServiceFactoryBean了,是以上面的配置也省了。

但是<mvc:annotation-driven />基本不用,因為總得做些個性化設定,那怎麼注冊FormattingConversionServiceFactoryBean給spring mvc呢?

起初我以為得從DefaultAnnotationHandlerMapping入手,後來通過看<mvc:annotation- driven />的解析器AnnotationDrivenBeanDefinitionParser源碼,才發現原來是 AnnotationMethodHandlerAdapter的屬性

Java代碼  

springMVC 前背景日期格式傳值解決方式之一(共二) @DateTimeFormat的使用和配置...
  1. RuntimeBeanReference conversionService = getConversionService(element, source, parserContext);  
  2. RuntimeBeanReference validator = getValidator(element, source, parserContext);  
  3. RootBeanDefinition bindingDef = new RootBeanDefinition(ConfigurableWebBindingInitializer.class);  
  4. bindingDef.setSource(source);  
  5. bindingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);  
  6. bindingDef.getPropertyValues().add("conversionService", conversionService);  
  7. bindingDef.getPropertyValues().add("validator", validator);  
  8. RootBeanDefinition annAdapterDef = new RootBeanDefinition(AnnotationMethodHandlerAdapter.class);  
  9. annAdapterDef.setSource(source);  
  10. annAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);  
  11. annAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef);  
  12. annAdapterDef.getPropertyValues().add("messageConverters", getMessageConverters(source));  

getConversionService方法内部

Java代碼  

springMVC 前背景日期格式傳值解決方式之一(共二) @DateTimeFormat的使用和配置...
  1. if (element.hasAttribute("conversion-service")) {  
  2.     return new RuntimeBeanReference(element.getAttribute("conversion-service"));  
  3. }  
  4. else {  
  5.     RootBeanDefinition conversionDef = new RootBeanDefinition(FormattingConversionServiceFactoryBean.class);  
  6.     conversionDef.setSource(source);  
  7.     conversionDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);  
  8.     String conversionName = parserContext.getReaderContext().registerWithGeneratedName(conversionDef);  
  9.     parserContext.registerComponent(new BeanComponentDefinition(conversionDef, conversionName));  
  10.     return new RuntimeBeanReference(conversionName);  
  11. }  

原來<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