Spring 3.0 引入 ConversionService 統一類型轉換體系,取代舊有 PropertyEditor,支援泛型、線程安全、可擴展。核心介面:
Converter:單一類型轉換器ConversionService:轉換服務入口,管理多個 ConverterConversionServiceFactoryBean:Spring 容器整合工廠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
}
}
}
<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"/>
@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd") Date date<form:input path="birthDate"/> 自動轉換conversionService.convert("2023-01-01", Date.class)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);
}
}
public class StringToEnumConverterFactory implements ConverterFactory {
@Override
public Converter getConverter(Class targetType) {
return new StringToEnumConverter<>(targetType);
}
}
Spring 的 ConversionService 提供強大、可擴展的類型轉換機制。核心步驟:實作 Converter → 註冊至 ConversionServiceFactoryBean → 啟用 annotation-driven。掌握 Converter、GenericConverter、ConverterFactory 三種擴展點,即可優雅處理各種類型轉換需求。