Skip to content

类型转换

默认情况下,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 SPIFormattingConversionServiceFactoryBean


补充教学

1. Converter vs Formatter

  • Converter (转换器): 这是一个通用的 SPI,用于将一种对象类型转换为另一种。它不关心 UI 或字符串展示,只负责数据类型的纯粹转换。
  • Formatter (格式化器): 专门用于将数据渲染为字符串或从字符串解析回数据,通常涉及本地化(Localization)逻辑。它常用于 Controller 接收路径变量、请求参数或呈现模型数据。

2. ISO 格式的重要性

在前后端分离的应用中,通常建议将日期格式统一为 ISO-8601(如 2023-10-27T10:00:00Z)。通过 registrar.setUseIsoFormat(true),你可以确保 Spring 能够一致地处理符合现代标准的日期字符串,而不再受浏览器本地语言设置的影响。

Based on Spring Framework.