首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring MVC 自定義類型轉換器實戰:從 Converter 到 FormattingConversionService 最佳實踐

     編輯:Java 相關知識

Spring MVC 的類型轉換體系支援將請求參數 (String) 自動綁定為任意複雜對象。本文通過完整實例講解自定義 Converter 實作、註冊機制、與格式化註解的協作關係。

預設轉換能力回顧

啟用 <mvc:annotation-driven /> 或 @EnableWebMvc 後,Spring 自動註冊:

  • 基本類型:String ↔ Integer、Long、Double、Boolean 等
  • 日期時間:@DateTimeFormat 支援的模式
  • 數字格式:@NumberFormat 支援的模式
  • 集合/數組:逗號分隔字串 → List/Array

自定義 Converter 實作全流程

場景:字串 "1001-zhangsan-IT" → Employee 對象

1. 目標實體

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    private Long id;
    private String name;
    private String department;
}

2. 實作 Converter 介面

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 預設)

進階:雙向轉換與格式化註解協作

Formatter 介面:支援本地化格式化

註冊 Formatter

配合 @DateTimeFormat 效果

GenericConverter:上下文感知轉換

常見問題與避坑

問題原因解決
Converter 不生效 未被 Component 掃描、或被自定義 WebMvcConfigurer 覆蓋 檢查包掃描路徑、確認未重複定義 conversionService
參數綁定失敗 400 Converter 拋出未捕獲異常、或格式不匹配 Converter 內捕獲異常拋出 IllegalArgumentException、前端參數格式對齊
路徑變量 {employee} 不轉換 PathVariable 預設不經 ConversionService Spring 3.2+ 已支援,確保版本、或使用 @PathVariable 配合 @DateTimeFormat
集合類型轉換異常 逗號分隔衝突業務分隔符 自定義 Converter 處理特定分隔符

最佳實踐總結

  1. 優先用 @Component + Converter:簡潔、自動註冊、Spring Boot 風格
  2. 複雜格式用 Formatter:需本地化、雙向轉換、表單回顯時
  3. 上下文相關用 GenericConverter:需根據字段註解、泛型類型動態決策
  4. 繼承體系用 ConverterFactory:單一來源 → 多目標子類
  5. 保留 FormattingConversionService:兼容 @DateTimeFormat/@NumberFormat 等標準註解
  6. 異常處理統一:Converter 內部捕獲解析異常,拋出 IllegalArgumentException 讓統一異常處理器捕獲

總結

Spring MVC 類型轉換體系以 Converter 為核心,Formatter 處理格式化,GenericConverter 支援上下文感知,ConverterFactory 解決繼承體系轉換。掌握四大介面與 FormattingConversionService 註冊機制,能將控制器從繁瑣的參數解析中解脫,實現領域對象的直接綁定,提升代碼可讀性與可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved