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

Spring 類型轉換核心:ConversionService 與 Converter 實戰詳解

     編輯:Java 相關知識

背景

Spring 3.0 引入 ConversionService 統一類型轉換體系,取代舊有 PropertyEditor,支援泛型、線程安全、可擴展。核心介面:

  • Converter:單一類型轉換器
  • ConversionService:轉換服務入口,管理多個 Converter
  • ConversionServiceFactoryBean:Spring 容器整合工廠

自訂轉換器:String → Date

import org.springframework.core.convert.converter.Converter;
import org.apache.commons.lang3.time.DateUtils;
import java.util.Date;

public class StringToDateConverter implements Converter {
    private String pattern = "yyyy-MM-dd"; // 預設格式
    
    public void setPattern(String pattern) { this.pattern = pattern; }
    
    @Override
    public Date convert(String source) {
        try {
            return DateUtils.parseDate(source, new String[]{pattern});
        } catch (Exception e) {
            return null; // 或拋出 ConversionFailedException
        }
    }
}

Spring XML 配置註冊

<bean id="conversionService" 
      class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.example.converter.StringToDateConverter">
                <property name="pattern" value="yyyy/MM/dd"/>
            </bean>
            <!-- 其他自訂 Converter -->
        </set>
    </property>
</bean>

<!-- 啟用註解驅動,自動註冊 conversionService -->
<mvc:annotation-driven conversion-service="conversionService"/>

使用場景

  • Controller 參數綁定:@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd") Date date
  • 表單提交:<form:input path="birthDate"/> 自動轉換
  • 程式化調用:conversionService.convert("2023-01-01", Date.class)

進階:GenericConverter 處理複雜轉換

public class IdToEntityConverter implements GenericConverter {
    @Override
    public Set getConvertibleTypes() {
        return Set.of(new ConvertiblePair(Long.class, User.class));
    }
    @Override
    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
        Long id = (Long) source;
        return userRepository.findById(id).orElse(null);
    }
}

條件轉換:ConverterFactory

public class StringToEnumConverterFactory implements ConverterFactory {
    @Override
    public  Converter getConverter(Class targetType) {
        return new StringToEnumConverter<>(targetType);
    }
}

總結

Spring 的 ConversionService 提供強大、可擴展的類型轉換機制。核心步驟:實作 Converter → 註冊至 ConversionServiceFactoryBean → 啟用 annotation-driven。掌握 Converter、GenericConverter、ConverterFactory 三種擴展點,即可優雅處理各種類型轉換需求。

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