亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
首頁 > Java > java教程 > 正文

Jackson深度克隆DTO時忽略特定類型數(shù)組屬性的策略

聖光之護
發(fā)布: 2025-10-15 09:33:31
原創(chuàng)
184人瀏覽過

Jackson深度克隆DTO時忽略特定類型數(shù)組屬性的策略

在spring boot應(yīng)用中,當需要深度克隆包含非序列化字段(如`multipartfile`及其數(shù)組)的dto時,傳統(tǒng)的`objectoutputstream`方法不可行。本文將探討如何利用jackson的`objectmapper`和`addmixin`機制,巧妙地忽略這些不可控dto中的特定類型數(shù)組屬性,從而實現(xiàn)dto的順利克隆,并指出處理集合類型時的局限性。

背景與挑戰(zhàn)

在開發(fā)過程中,我們經(jīng)常需要對DTO(數(shù)據(jù)傳輸對象)進行深度克隆,例如在處理請求參數(shù)時。然而,當DTO中包含如org.springframework.web.multipart.MultipartFile這類非序列化接口的字段時,傳統(tǒng)的Java序列化(ObjectOutputStream和ObjectInputStream)方法會失效。更具挑戰(zhàn)性的是,有時我們無法修改這些DTO的定義,例如通過添加transient關(guān)鍵字或@JsonIgnore注解來排除字段。

Jackson庫提供了一種靈活的解決方案,即通過ObjectMapper的addMixIn()方法結(jié)合@JsonIgnoreType注解,在不修改原始類定義的情況下,指示Jackson忽略特定類型的字段。

初始嘗試與局限

為了忽略DTO中的MultipartFile字段,我們可能會嘗試以下Jackson配置:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
import org.springframework.web.multipart.MultipartFile;

public class DtoCloner {

    private Object makeClone(Object obj) {
        ObjectMapper mapper = new ObjectMapper();
        // 添加針對 MultipartFile 類型的 MixIn
        mapper.addMixIn(MultipartFile.class, JacksonMixInForIgnoreType.class);
        try {
            // 將對象序列化為JSON字符串,再反序列化回對象
            return mapper.readValue(mapper.writeValueAsString(obj), obj.getClass());
        } catch (JsonProcessingException e) {
            throw new RuntimeException("DTO克隆失敗", e);
        }
    }

    // 定義一個空的 MixIn 接口或類,并用 @JsonIgnoreType 標記
    @JsonIgnoreType
    static class JacksonMixInForIgnoreType {}

    // 示例DTO,可能包含 MultipartFile 字段
    static class DeepCopyDto {
        private String name;
        private MultipartFile singleFile;
        // ... 其他字段
    }
}
登錄后復(fù)制

上述代碼對于DTO中包含單個MultipartFile字段的情況通常是有效的。然而,當DTO中包含MultipartFile的數(shù)組,例如MultipartFile[] fileArray;時,這種策略會失敗,并拋出InvalidDefinitionException異常,指出無法找到java.io.FileDescriptor的序列化器,錯誤信息大致如下:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.io.FileDescriptor ... (through reference chain: com.example.uploadingfiles.DeepCopyDto["fileArray"]->org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile[0]->org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile["inputStream"]->java.io.FileInputStream["fd"])
登錄后復(fù)制

這表明Jackson在處理數(shù)組類型時,并未將MultipartFile[]視為與MultipartFile相同的類型進行忽略,而是嘗試深入數(shù)組內(nèi)部,最終遇到無法序列化的底層IO流對象。

FineVoice語音克隆
FineVoice語音克隆

免費在線語音克隆,1 分鐘克隆你的聲音,保留口音和所有細微差別。

FineVoice語音克隆61
查看詳情 FineVoice語音克隆

解決方案:明確指定數(shù)組類型的MixIn

問題的根源在于Jackson在應(yīng)用MixIn時,將MultipartFile和MultipartFile[]視為兩種不同的類型。因此,要忽略MultipartFile數(shù)組,我們需要為數(shù)組類型本身也添加一個MixIn。

修正后的makeClone方法如下:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
import org.springframework.web.multipart.MultipartFile;

public class DtoCloner {

    private Object makeClone(Object obj) {
        ObjectMapper mapper = new ObjectMapper();
        // 1. 添加針對 MultipartFile 類型的 MixIn
        mapper.addMixIn(MultipartFile.class, JacksonMixInForIgnoreType.class);
        // 2. 額外添加針對 MultipartFile 數(shù)組類型的 MixIn
        mapper.addMixIn(MultipartFile[].class, JacksonMixInForIgnoreType.class); // 關(guān)鍵改動
        try {
            return mapper.readValue(mapper.writeValueAsString(obj), obj.getClass());
        } catch (JsonProcessingException e) {
            throw new RuntimeException("DTO克隆失敗", e);
        }
    }

    @JsonIgnoreType
    static class JacksonMixInForIgnoreType {}

    // 示例DTO,現(xiàn)在可以包含 MultipartFile 數(shù)組
    static class DeepCopyDto {
        private String name;
        private MultipartFile singleFile;
        private MultipartFile[] fileArray; // 包含 MultipartFile 數(shù)組
        // ... 其他字段
    }
}
登錄后復(fù)制

通過在ObjectMapper中額外添加一行mapper.addMixIn(MultipartFile[].class, JacksonMixInForIgnoreType.class);,我們明確告訴Jackson:當遇到MultipartFile類型或MultipartFile數(shù)組類型時,都應(yīng)該應(yīng)用JacksonMixInForIgnoreType,從而忽略這些字段的序列化。

注意事項與局限性

  1. 類型匹配的精確性: Jackson的addMixIn機制要求精確匹配類型。MultipartFile和MultipartFile[]在JVM中是不同的類型,因此需要分別配置。
  2. 集合類型(如List<MultipartFile>): 值得注意的是,上述方法對于泛型集合類型(如List<MultipartFile>)并不直接適用。addMixIn無法直接應(yīng)用于List.class來忽略其內(nèi)部特定泛型元素。要忽略List<MultipartFile>字段,如果可以修改DTO,最佳實踐是直接在該字段上使用@JsonIgnore注解。如果DTO不可控,可能需要更復(fù)雜的自定義序列化器或反序列化器來處理,或者在克隆前手動將這些字段置空。
  3. 性能考量: 深度克隆涉及對象的序列化和反序列化,對于大型或復(fù)雜的對象圖,這可能帶來一定的性能開銷。在性能敏感的場景下,應(yīng)權(quán)衡其利弊或考慮其他克隆策略(如手動屬性拷貝)。
  4. Jackson版本: 本文示例基于Jackson Databind 2.13.1。不同版本可能存在細微差異,但核心機制通常保持一致。

總結(jié)

當需要深度克隆包含不可控的非序列化類型(如MultipartFile)及其數(shù)組的DTO時,Jackson的ObjectMapper結(jié)合addMixIn提供了一個強大的解決方案。關(guān)鍵在于理解Jackson對類型匹配的精確性要求,并為原始類型及其數(shù)組類型分別配置MixIn。然而,對于泛型集合類型,此方法存在局限性,通常需要結(jié)合其他策略來解決。掌握這些技巧,能夠幫助開發(fā)者在處理復(fù)雜DTO克隆場景時更加靈活和高效。

以上就是Jackson深度克隆DTO時忽略特定類型數(shù)組屬性的策略的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應(yīng)法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓,幫助PHP學習者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學習
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號