3.5. spring字段格式
正如上一节所讨论的,core.convert
是一个通用的类型转换系统。它提供了一个统一的ConversionService
API 以及一个强类型的Converter
SPI,用于实现从一种类型到另一种类型的转换逻辑。Spring 容器使用此系统绑定 bean 属性值。此外,Spring 表达式语言(SpEL)都使用这个系统来绑定字段值。例如,当 SpEL 需要将 Short
强制转换为Long
以完成一次expression.setValue(Object bean, Object value)
尝试时,core.convert
系统会执行强制。
现在考虑典型客户端环境的类型转换要求,例如 Web 或桌面应用程序。在这样的环境中,您通常转换String
以支持客户端回发过程,以及转换回String
以支持视图呈现过程。此外,您经常需要本地化String
值。更通用的core.convert
Converter
SPI 不直接解决此类格式要求。为了直接解决这些问题,Spring 3 引入了一个方便的Formatter
SPI,它为客户端环境的实现提供了一个简单而健壮的替代方案。PropertyEditor
Converter
通常,当您需要实现通用类型转换逻辑时,您可以使用SPI——例如,在 ajava.util.Date
和 a之间进行转换Long
。Formatter
当您在客户端环境(例如 Web 应用程序)中工作并且需要解析和打印本地化的字段值时,您可以使用SPI。ConversionService
为两个 SPI 提供了统一的类型转换 API 。
3.5.1. Formatter
SPI
实现字段格式化逻辑的Formatter
SPI 简单且强类型。以下清单显示了Formatter
接口定义:
Formatter
从Printer
和Parser
构建块接口进行扩展。以下清单显示了这两个接口的定义:
要创建您自己的格式化程序,请实现前面所示的格式化程序接口。将 T
参数化为您希望格式化的对象类型——例如 java.util.Date
。实现 print()
操作以打印 T
的实例以在客户端区域设置中显示。实现 parse()
操作以从客户端语言环境返回的格式化表示中解析 T
的实例。如果解析尝试失败,您的 Formatter
应该抛出 ParseException
或 IllegalArgumentException
。请注意确保您的 Formatter 实现是线程安全的。
为了方便起见,格式子包提供了几种 Formatter
实现。 number
包提供 NumberStyleFormatter
、CurrencyStyleFormatter
和PercentStyleFormatter
来格式化使用 java.text.NumberFormat
的 Number
对象。datetime
包提供了一个 DateFormatter
来使用java.text.DateFormat
来格式化java.util.Date
对象。
下面DateFormatter
是一个实现Formatter
的示例:
Spring 团队欢迎社区驱动的Formatter
贡献。请参阅 GitHub 问题以做出贡献。
3.5.2. 注解驱动的格式化
字段格式可以通过字段类型或注解进行配置。要将注解绑定到 Formatter
,请实现AnnotationFormatterFactory
. 以下清单显示了AnnotationFormatterFactory
接口的定义:
创建一个实现:
将
annotationType
参数化为您希望与格式化逻辑相关联的字段 - 例如org.springframework.format.annotation.DateTimeFormat
.getFieldTypes()
已返回可以使用注解的字段类型。getPrinter()
返回Printer
以打印带注解的字段的值。已
getParser()
返回Parser
以解析带clientValue
注解的字段。
以下示例AnnotationFormatterFactory
的实现将@NumberFormat
注解绑定到格式化程序以指定数字样式或模式:
要触发格式化,您可以使用@NumberFormat
注解字段,如以下示例所示:
格式注解 API
I org.springframework.format.annotation
包中存在可移植格式注解 AP 。您可以使用@NumberFormat
格式化Number
字段,例如Double
和 Long
,@DateTimeFormat
格式化java.util.Date
, java.util.Calendar
,Long
(用于毫秒时间戳)以及 JSR-310 java.time
。
以下示例用于@DateTimeFormat
将java.util.Date
格式化为 ISO 日期 (yyyy-MM-dd):
3.5.3. FormatterRegistry
SPI
FormatterRegistry
是一个用于注册格式化程序和转换器的 SPI。 FormattingConversionService
是FormatterRegistry
适用于大多数环境的实现。您可以以编程方式或声明方式将此变体配置为 Spring bean,例如使用FormattingConversionServiceFactoryBean
. 由于此实现还实现了ConversionService
,因此您可以直接将其配置为与 SpringDataBinder
和 Spring 表达式语言 (SpEL) 一起使用。
以下清单显示了FormatterRegistry
SPI:
如前面的清单所示,您可以按字段类型或注解注册格式化程序。
SPI 让您可以集中配置格式规则,而不是在FormatterRegistry
控制器之间复制此类配置。例如,您可能希望强制所有日期字段都以某种方式格式化,或者具有特定注解的字段以某种方式格式化。使用共享的FormatterRegistry
,您只需定义一次这些规则,并在需要格式化时应用它们。
3.5.4. FormatterRegistrar
SPI
FormatterRegistrar
是一个 SPI,用于通过 FormatterRegistry 注册格式化程序和转换器。下面的清单显示了它的接口定义:
在为给定的格式类别(例如日期格式)注册多个相关转换器和格式器时,FormatterRegistrar
很有用。在声明式注册不足的情况下,它也很有用——例如,当格式化程序需要在与其自身<T>
不同的特定字段类型下进行索引时,或者在注册Printer
/Parser
对时。下一节提供有关转换器和格式化程序注册的更多信息。
3.5.5. 在 Spring MVC 中配置格式化
请参阅Spring MVC 章节中的转换和格式化。
最后更新于