Spring MVC 的類型轉換體系支援將請求參數 (String) 自動綁定為任意複雜對象。本文通過完整實例講解自定義 Converter 實作、註冊機制、與格式化註解的協作關係。
啟用 <mvc:annotation-driven /> 或 @EnableWebMvc 後,Spring 自動註冊:
@DateTimeFormat 支援的模式@NumberFormat 支援的模式@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
private Long id;
private String name;
private String department;
}
3. 控制器使用
4. 測試驗證
GET /api/employees/1001-zhangsan-IT → Employee(id=1001, name=zhangsan, department=IT) POST /api/employees/query?employee=1002-lisi-HR → Employee(id=1002, name=lisi, department=HR)關鍵點:Converter 註冊機制
方式一:Component 掃描 (Spring Boot 推薦)
只要 Converter 實現類標註
@Component,且在掃描路徑下,Spring Boot 自動註冊到FormattingConversionService。方式二:WebMvcConfigurer 手動註冊 (完全控制)
方式三:XML 配置 (傳統項目)
<mvc:annotation-driven conversion-service="conversionService" /> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.example.converter.StringToEmployeeConverter" /> </set> </property> </bean>為什麼推薦 FormattingConversionServiceFactoryBean?
| FactoryBean | 特性 | 推薦場景 |
|---|---|---|
| ConversionServiceFactoryBean | 僅核心轉換,不支援 @DateTimeFormat/@NumberFormat | 極簡項目、無格式化需求 |
| FormattingConversionServiceFactoryBean | 繼承 ConversionService + 實現 FormattingConversionService,支援註解格式化 | ✅ 通用 Web 項目 (Spring Boot 預設) |
配合 @DateTimeFormat 效果
GenericConverter:上下文感知轉換
常見問題與避坑
問題 原因 解決 Converter 不生效 未被 Component 掃描、或被自定義 WebMvcConfigurer 覆蓋 檢查包掃描路徑、確認未重複定義 conversionService 參數綁定失敗 400 Converter 拋出未捕獲異常、或格式不匹配 Converter 內捕獲異常拋出 IllegalArgumentException、前端參數格式對齊 路徑變量 {employee} 不轉換 PathVariable 預設不經 ConversionService Spring 3.2+ 已支援,確保版本、或使用 @PathVariable 配合 @DateTimeFormat 集合類型轉換異常 逗號分隔衝突業務分隔符 自定義 Converter 處理特定分隔符 最佳實踐總結
- 優先用 @Component + Converter:簡潔、自動註冊、Spring Boot 風格
- 複雜格式用 Formatter:需本地化、雙向轉換、表單回顯時
- 上下文相關用 GenericConverter:需根據字段註解、泛型類型動態決策
- 繼承體系用 ConverterFactory:單一來源 → 多目標子類
- 保留 FormattingConversionService:兼容 @DateTimeFormat/@NumberFormat 等標準註解
- 異常處理統一:Converter 內部捕獲解析異常,拋出 IllegalArgumentException 讓統一異常處理器捕獲
總結
Spring MVC 類型轉換體系以
Converter為核心,Formatter處理格式化,GenericConverter支援上下文感知,ConverterFactory解決繼承體系轉換。掌握四大介面與FormattingConversionService註冊機制,能將控制器從繁瑣的參數解析中解脫,實現領域對象的直接綁定,提升代碼可讀性與可維護性。