类型转换 (Type Conversion)
一些基于字符串的请求输入(如 @RequestParam、@RequestHeader、@PathVariable、@MatrixVariable 和 @CookieValue)如果声明为非 String 类型,则需要进行类型转换。
自动转换
Spring 会根据配置的转换器自动应用类型转换。默认情况下支持简单类型(如 int、long、Date、UUID 等)。
自定义转换
你可以通过以下方式自定义转换逻辑:
- WebDataBinder:在控制器中使用
@InitBinder方法配置规则。 - 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)这比全局配置更灵活,允许不同的接口使用不同的日期格式。