Skip to content

类型转换 (Type Conversion)

一些基于字符串的请求输入(如 @RequestParam@RequestHeader@PathVariable@MatrixVariable@CookieValue)如果声明为非 String 类型,则需要进行类型转换。

自动转换

Spring 会根据配置的转换器自动应用类型转换。默认情况下支持简单类型(如 intlongDateUUID 等)。

自定义转换

你可以通过以下方式自定义转换逻辑:

  1. WebDataBinder:在控制器中使用 @InitBinder 方法配置规则。
  2. FormattingConversionService:注册全局的 Formatter 实现。

空值处理

一个实际问题是空字符串的处理。如果转换结果为 null(常发生于 LongUUID 等),则该值通常被视为缺失。

  • 允许注入 null:请在注解中设置 required = false 或将参数声明为 @Nullable

注意

从 Spring Framework 5.3 开始,即使经过类型转换,非空参数也会被强制执行。如果你的方法打算接受 null,必须明确标记为 @Nullablerequired=false


补充教学

1. 魔法背后的 FormattingConversionService

当你把一个日期字符串 2023-10-01 传给 LocalDate 参数时,Spring 内部的 ConversionService 会寻找合适的 ConverterFormatter

  • 全局设置:通常在 WebMvcConfigureraddFormatters 方法中添加规则,这样全系统都能复用。

2. 枚举类型的转换

Spring 默认支持按枚举的 名称(Name) 进行转换。

  • 进阶玩法:如果你的前端传的是数字 ID 或特定 Code,你可以通过自定义 Converter<String, YourEnum> 来实现灵活的转换逻辑。

3. @DateTimeFormat

对于日期类型,最常见的做法是在参数上直接加注解:

java
public void list(@RequestParam @DateTimeFormat(iso = ISO.DATE) LocalDate date)

这比全局配置更灵活,允许不同的接口使用不同的日期格式。

Based on Spring Framework.