格式化器的知识点有两个。内置,自定义。
自定义的实现方式有两种,实现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); } }