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

Spring 類型轉換體系深度解析:PropertyEditor vs Converter 選型指南

     編輯:Java 綜合教學

Spring 類型轉換體系深度解析:PropertyEditor vs Converter 選型指南

Spring 提供兩種類型轉換機制:舊有的 PropertyEditor(基於字串轉換)與 Spring 3.0 引入的通用 Converter(類型到類型)。理解兩者差異與適用場景,對正確處理參數綁定、表單提交、檔案上傳至關重要。

一、PropertyEditor:字串到類型的專用轉換器

適用場景:前端表單提交的字串參數綁定到後端對象屬性(如 String → Enum、String → Date、String → 自定義類型)。

實戰案例:狀態碼轉換為 TypeStatus 對象

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 輸出字串。

二、Converter:通用的類型到類型轉換器

適用場景:非字串類型之間的轉換,如 MultipartFile → byte[]、String → UUID、Entity → DTO 等。

實戰案例:MultipartFile 轉 byte[] 存入資料庫 Blob

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>

三、優先級與選型總結

特性PropertyEditorConverter
轉換方向String ↔ ObjectSourceType → TargetType(任意類型)
註冊方式@InitBinder + registerCustomEditorConversionService + 轉換器列表
作用範圍可限定屬性名全局按類型匹配
優先級高(Spring 優先查找)低
典型場景表單參數綁定、Enum/Date 轉換檔案上傳、複雜對象映射、REST 參數轉換

最佳實踐:

  • 表單字串參數綁定 → 使用 @InitBinder + PropertyEditor。
  • 非字串類型轉換(如檔案、JSON 對象) → 實現 Converter 並註冊至 ConversionService。
  • 兩者同時存在時,PropertyEditor 優先生效。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved