Skip to content

类型转换 (Type Conversion) ​

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

自动转换 ​

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

自定义转换 ​

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

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

空值处理 ​

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

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

注意

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


补充教学 ​

1. 魔法背后的 FormattingConversionService ​

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

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

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.