天天看點

conversionService類型轉換類源碼詳解

conversionService是spring中的從前端到後端的類型轉換器,一般我們會配置<mvc:annotation-driven/>或者自己手動配置HandlerMapping和HandlerAdapter。如果需要從前端頁面的字元串自動映射成Date類型等類型轉換,我們就要自己手動配置conversionService。

<bean
            class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="webBindingInitializer">
            <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
                <!--時間、數字格式轉換器,string轉Date類等-->
                <property name="conversionService">
                    <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>
                </property>
            </bean>
        </property>
    </bean>
           

conversionService是AnnotationMethodHandlerAdapter類中的webBindingInitializer的一個屬性,我們看下此類的類型關系:

conversionService類型轉換類源碼詳解

我們看到了InitializingBean這個類,那麼我們要進入其afterPropertiesSet()方法中檢視一下了,

public void afterPropertiesSet() {
		this.conversionService = new DefaultFormattingConversionService(this.embeddedValueResolver, this.registerDefaultFormatters);
		ConversionServiceFactory.registerConverters(this.converters, this.conversionService);
		registerFormatters();
	}
           

我們重點看下标紅的這塊代碼,後面我們會進入到addDefaultFormatters方法中:

public DefaultFormattingConversionService(StringValueResolver embeddedValueResolver, boolean registerDefaultFormatters) {
		this.setEmbeddedValueResolver(embeddedValueResolver);
		DefaultConversionService.addDefaultConverters(this);
		if (registerDefaultFormatters) {
			addDefaultFormatters(this);
		}
	}
           
public static void addDefaultFormatters(FormatterRegistry formatterRegistry) {
   formatterRegistry.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory());
   if (jodaTimePresent) {
      new JodaTimeFormatterRegistrar().registerFormatters(formatterRegistry);
   } else {
      formatterRegistry.addFormatterForFieldAnnotation(new NoJodaDateTimeFormatAnnotationFormatterFactory());
   }
}      

我們看到上面有一個判斷是jodaTimePresent,這個是什麼呢:

private static final boolean jodaTimePresent = ClassUtils.isPresent(
			"org.joda.time.LocalDate", DefaultFormattingConversionService.class.getClassLoader());
           

這個是判斷項目中是否能加載出org.joda.time.LocalDate這個類,這個類在什麼地方呢,我們就需要引入jar包,否則,就算你前面spring中做了配置,也無法讓spring加載時間轉換器,此時引入此jar包即可:

<dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.3</version>
        </dependency>
           

繼續閱讀