Spring 提供兩種類型轉換機制:舊有的 PropertyEditor(基於字串轉換)與 Spring 3.0 引入的通用 Converter(類型到類型)。理解兩者差異與適用場景,對正確處理參數綁定、表單提交、檔案上傳至關重要。
適用場景:前端表單提交的字串參數綁定到後端對象屬性(如 String → Enum、String → Date、String → 自定義類型)。
public class TypeStatus {
private Integer value;
private String msg;
public TypeStatus(Integer value, String msg) { this.value = value; this.msg = msg; }
public static TypeStatus toBean(Integer value) {
if (value == 0) return new TypeStatus(0, "成功");
if (value == 1) return new TypeStatus(1, "失敗");
return null;
}
// getter 省略
}
public class PoDemo { private TypeStatus status; /* getter/setter */ }
在 Controller 中註冊:
@InitBinder
public void initBinder(WebDataBinder binder) {
// 僅針對名為 status 的 TypeStatus 屬性
binder.registerCustomEditor(TypeStatus.class, "status", new TypeStatusEditor());
}
編寫編輯器:
public class TypeStatusEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
TypeStatus ts = (TypeStatus) getValue();
return String.valueOf(ts.getValue()); // 物件 → 字串(回顯用)
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
TypeStatus ts = TypeStatus.toBean(Integer.parseInt(text)); // 字串 → 物件
setValue(ts);
}
}
關鍵點:PropertyEditor 強制經過 String 中介,setAsText 接收字串,getAsText 輸出字串。
適用場景:非字串類型之間的轉換,如 MultipartFile → byte[]、String → UUID、Entity → DTO 等。
public class PoDemo { private byte[] img; /* getter/setter */ }
實現 Converter:
public class MultipartFileToByteArrayConverter implements Converter<CommonsMultipartFile, byte[]> {
@Override
public byte[] convert(CommonsMultipartFile source) {
return source.getBytes();
}
}
在 Spring MVC 配置中註冊:
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.example.converter.MultipartFileToByteArrayConverter"/>
</list>
</property>
</bean>
| 特性 | PropertyEditor | Converter |
|---|---|---|
| 轉換方向 | String ↔ Object | SourceType → TargetType(任意類型) |
| 註冊方式 | @InitBinder + registerCustomEditor | ConversionService + 轉換器列表 |
| 作用範圍 | 可限定屬性名 | 全局按類型匹配 |
| 優先級 | 高(Spring 優先查找) | 低 |
| 典型場景 | 表單參數綁定、Enum/Date 轉換 | 檔案上傳、複雜對象映射、REST 參數轉換 |
最佳實踐:
@InitBinder + PropertyEditor。Converter 並註冊至 ConversionService。PropertyEditor 優先生效。