MapStruct 中将 String 映射为 Enum 的正确实践

夜宇吖_5225

夜宇吖_5225

2026-08-08

967人浏览

原创

MapStruct 中将 String 映射为 Enum 的正确实践

MapStruct 默认支持字符串到枚举的自动映射(区分大小写、按名称匹配),无需手动编写 @ValueMapping,只需确保源字符串与枚举常量名完全一致即可。

mapstruct 默认支持字符串到枚举的自动映射(区分大小写、按名称匹配),无需手动编写 `@valuemapping`,只需确保源字符串与枚举常量名完全一致即可。

在使用 MapStruct 将 DTO 中的 String 字段映射为 Java 枚举类型(如 MyEnum)时,关键在于理解 MapStruct 的默认枚举映射机制:它会自动尝试通过 Enum.valueOf() 按枚举常量的 精确名称(name) 进行匹配,前提是字符串值与枚举常量名严格一致(例如 "ONE" → MyEnum.ONE)。

以下是一个完整、可运行的示例:

// 枚举定义
public enum MyEnum {
    ONE, TWO;
}
// DTO 类(来源)
public class MyDTO {
    private String value;

    public String getValue() { return value; }
    public void setValue(String value) { this.value = value; }
}
// 目标实体类
public class MyClass {
    private MyEnum value;

    public MyEnum getValue() { return value; }
    public void setValue(MyEnum value) { this.value = value; }
}
// MapStruct 映射器(启用 Spring 组件模型)
@Mapper(componentModel = "spring")
public interface MyDTOMapper {
    @Mapping(source = "value", target = "value")
    MyClass toMyClass(MyDTO dto);
}

✅ 关键说明:

  • 不需要 @ValueMapping 或自定义方法——MapStruct 会自动调用 MyEnum.valueOf("ONE");
  • 字符串必须完全匹配枚举常量名(如 "ONE" ✅,"one-code" ❌,"one" ❌);
  • 若需不区分大小写或自定义映射逻辑(如 "one-code" → MyEnum.ONE),才需显式声明 @ValueMapping 或 @Named 方法;
  • 确保编译时启用了 MapStruct 注解处理器(如 Maven 中配置 mapstruct-processor)。

⚠️ 注意事项:

  • 若输入字符串不匹配任何枚举常量(如 "THREE"),valueOf() 将抛出 IllegalArgumentException,建议在生产环境中配合 @AfterMapping 或自定义映射方法做容错处理;
  • 使用 componentModel = "spring" 可让生成的实现类被 Spring 自动注入;
  • 避免在 @ValueMapping 中错误地将 source 设为字面量(如 "one-code")、target 设为枚举实例(如 "ONE")——正确写法应为 source = "one-code"、target = "ONE",且需配合 @IterableMapping 或 @ValueMapping 在方法级声明。

运行验证:

public static void main(String[] args) {
    MyDTOMapper mapper = Mappers.getMapper(MyDTOMapper.class); // 推荐方式(非 new Impl)
    MyDTO dto = new MyDTO();
    dto.setValue("ONE");
    MyClass result = mapper.toMyClass(dto);
    System.out.println(result.getValue()); // 输出:ONE
}

综上,MapStruct 对 String ↔ Enum 的映射简洁高效,优先依赖默认行为;仅当业务逻辑要求非标准转换时,再引入显式映射策略。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6279

3

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

570

5

golang map相关教程
golang map相关教程

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

2025.11.16

343

7

golang map原理
golang map原理

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

2025.11.17

513

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

283

6

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

20

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

0

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

0

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习