类型转换
默认情况下,Spring 会安装各种数字和日期类型的格式化器,并支持通过在字段和参数上使用 @NumberFormat、@DurationFormat 和 @DateTimeFormat 进行自定义。
注册自定义格式化器和转换器
要注册自定义的格式化器 (Formatters) 和转换器 (Converters),请使用以下配置:
java
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// 注册自定义转换逻辑
// registry.addConverter(new MyConverter());
}
}kotlin
@Configuration
class WebConfiguration : WebMvcConfigurer {
override fun addFormatters(registry: FormatterRegistry) {
// ...
}
}xml
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="org.example.MyConverter"/>
</set>
</property>
<property name="formatters">
<set>
<bean class="org.example.MyFormatter"/>
<bean class="org.example.MyAnnotationFormatterFactory"/>
</set>
</property>
<property name="formatterRegistrars">
<set>
<bean class="org.example.MyFormatterRegistrar"/>
</set>
</property>
</bean>默认日期格式化
默认情况下,Spring MVC 在解析和格式化日期值时会考虑请求的 Locale。这对于通过 HTML <input> 字段(表示为 String)提交的日期非常有效。
然而,对于 HTML5 的 "date" 和 "time" 类型的表单字段,浏览器会使用 HTML 规范中定义的固定格式。在这种情况下,可以按如下方式自定义日期和时间格式化:
java
@Configuration
public class DateTimeWebConfiguration implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(true); // 启用 ISO 格式 (yyyy-MM-dd)
registrar.registerFormatters(registry);
}
}kotlin
@Configuration
class DateTimeWebConfiguration : WebMvcConfigurer {
override fun addFormatters(registry: FormatterRegistry) {
DateTimeFormatterRegistrar().apply {
setUseIsoFormat(true)
registerFormatters(registry)
}
}
}提示
有关何时使用 FormatterRegistrar 实现的更多信息,请参阅 FormatterRegistrar SPI 和 FormattingConversionServiceFactoryBean。
补充教学
1. Converter vs Formatter
- Converter (转换器): 这是一个通用的 SPI,用于将一种对象类型转换为另一种。它不关心 UI 或字符串展示,只负责数据类型的纯粹转换。
- Formatter (格式化器): 专门用于将数据渲染为字符串或从字符串解析回数据,通常涉及本地化(Localization)逻辑。它常用于 Controller 接收路径变量、请求参数或呈现模型数据。
2. ISO 格式的重要性
在前后端分离的应用中,通常建议将日期格式统一为 ISO-8601(如 2023-10-27T10:00:00Z)。通过 registrar.setUseIsoFormat(true),你可以确保 Spring 能够一致地处理符合现代标准的日期字符串,而不再受浏览器本地语言设置的影响。