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的一個屬性,我們看下此類的類型關系:
我們看到了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>