0

0

使用 MapStruct 忽略 Enum 字段的正确姿势

霞舞

霞舞

发布时间:2025-10-07 13:00:28

|

709人浏览过

|

来源于php中文网

原创

使用 mapstruct 忽略 enum 字段的正确姿势

本文档旨在帮助开发者在使用 MapStruct 进行对象映射时,如何正确地忽略 Enum 类型的字段。我们将通过示例代码和详细解释,展示如何配置 Mapper 接口,以实现对特定 Enum 字段的忽略,从而避免不必要的映射错误。

在使用 MapStruct 进行对象映射时,有时需要忽略某些字段,特别是当涉及到 Enum 类型时。直接在 List 的 Mapper 方法上使用 @Mapping(source = "type", target = "type", ignore = true) 可能不会生效。这是因为你实际上是在映射 List 对象,而不是 List 中包含的 Document 和 DocumentDTO 对象。

要解决这个问题,需要创建两个 Mapper 方法:一个用于处理 List 的映射,另一个用于处理 Document 到 DocumentDTO 的映射。将 @Mapping 注解添加到后者的方法上,才能正确忽略 Enum 字段。

具体实现步骤如下:

  1. 定义 Entity 和 DTO:

    首先,定义你的 Entity 类 Document 和 DTO 类 DocumentDTO。确保 DTO 中的字段类型为 Enum。

    @Entity
    public class Document {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer id;
    
        private String type; //Entity中使用String
    }
    
    @Data
    public class DocumentDTO {
    
        private Integer id;
        private DocumentsEnum type; // DTO中使用Enum
    }
    
    public enum DocumentsEnum {
        MAIN,
        OTHER
    }
  2. 创建 Mapper 接口:

    创建 Mapper 接口,并定义两个方法:listMapper 用于映射 List,mapper 用于映射单个 Document 到 DocumentDTO。在 mapper 方法上使用 @Mapping 注解来忽略 Enum 字段。

    通义灵码
    通义灵码

    阿里云出品的一款基于通义大模型的智能编码辅助工具,提供代码智能生成、研发智能问答能力

    下载
    import org.mapstruct.Mapper;
    import org.mapstruct.Mapping;
    import java.util.List;
    
    @Mapper
    public interface DocumentsMapper {
    
        List listMapper(List document);
    
        @Mapping(source = "type", target = "type", ignore = true)
        DocumentDTO mapper(Document document);
    }

    解释:

    • @Mapper 注解: 声明这是一个 MapStruct Mapper 接口。
    • listMapper(List document): 该方法负责将 List 映射到 List。 MapStruct 会自动识别并调用 mapper(Document document) 方法来处理 List 中的每个元素。
    • @Mapping(source = "type", target = "type", ignore = true):这个注解告诉 MapStruct 忽略从 Document 对象的 type 字段到 DocumentDTO 对象的 type 字段的映射。
  3. 使用 Mapper:

    在你的代码中使用 Mapper 接口进行对象映射。

    // 获取 DocumentsMapper 的实例 (MapStruct 会自动生成实现类)
    DocumentsMapper documentsMapper = Mappers.getMapper(DocumentsMapper.class);
    
    // 假设有一个 List
    List documents = ...;
    
    // 使用 listMapper 进行映射
    List documentDTOs = documentsMapper.listMapper(documents);

注意事项:

  • 确保你的 MapStruct 依赖已正确配置。
  • MapStruct 会自动生成 Mapper 接口的实现类,你无需手动编写。
  • 如果需要自定义映射逻辑,可以使用 @AfterMapping 注解。

总结:

通过将 List 的映射和单个对象的映射分离,并在单个对象的 Mapper 方法上使用 @Mapping 注解,可以有效地忽略 Enum 类型的字段。这种方法确保了 MapStruct 能够正确处理 List 的映射,并按照你的配置忽略指定的字段。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1072

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

127

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

858

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

117

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

170

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

16

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.8万人学习

C# 教程
C# 教程

共94课时 | 7.5万人学习

Java 教程
Java 教程

共578课时 | 50.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号