格式化器的知识点有两个。内置,自定义。
自定义的实现方式有两种,实现Formatter接口,实现AnnotationFormatterFactory接口,接口的第一个泛型参数为自定义注解
1、Formatter
第一步,编写自定义Formatter接口实现类,其中print方法表示将对象转换为特定字符串,parse方法表示将特定字符串转换为对象。
第二步,注册,类似于转换器的第二种方式,设置FormattingConversionServiceFactoryBean的formatter属性。
<bean id="formatService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <!-- 配置formatter属性 --> <property name="formatters"> <set> <!-- 自己编写的formatter接口实现类 --> <bean class="com.formatter.XXFormatterImpl" /> </set> </property> </bean>
2、AnnotationFormatterFactory
第一步,实现AnnotationFormatterFactory接口,接口的第一个参数为自定义注解。其中getPrinter方法返回Printer接口的实现类,getParser返回Parser接口的实现类,可以统一返回Formatter接口的实现类。
第二步,注册,同Formatter。
第三步,验证,添加在属性上即可。示例参考
3、内置
源代码如下:
public static void addDefaultFormatters(FormatterRegistry formatterRegistry) {
// Default handling of number values, 数字
formatterRegistry.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory());
// Default handling of monetary values, 货币
if (jsr354Present) {
formatterRegistry.addFormatter(new CurrencyUnitFormatter());
formatterRegistry.addFormatter(new MonetaryAmountFormatter());
formatterRegistry.addFormatterForFieldAnnotation(new Jsr354NumberFormatAnnotationFormatterFactory());
}
// Default handling of date-time values
// just handling JSR-310 specific date and time types,日期
new DateTimeFormatterRegistrar().registerFormatters(formatterRegistry);
if (jodaTimePresent) {
// handles Joda-specific types as well as Date, Calendar, Long
new JodaTimeFormatterRegistrar().registerFormatters(formatterRegistry);
}
else {
// regular DateFormat-based Date, Calendar, Long converters
new DateFormatterRegistrar().registerFormatters(formatterRegistry);
}
}