使用 MapStruct 映射枚举

💡 原文中文,约12600字,阅读约需30分钟。
📝

内容提要

MapStruct是一个用于在REST API响应映射中映射枚举的工具。它可以将外部API状态代码转换为应用程序的内部状态枚举,并简化数据转换过程。通过使用@ValueMapping注释,可以将源枚举中的常量映射到目标枚举中具有不同名称的常量。此外,MapStruct还可以处理枚举与其他类型之间的映射,处理未知的枚举值,并处理空值。

🔎

延伸解读

枚举映射的完整覆盖与测试必要性

文章强调必须将所有源枚举值映射到目标,否则可能引发意外行为。MapStruct 在编译时检查未映射的枚举值,若未显式处理,会抛出错误。因此,开发中应通过单元测试彻底验证每个映射,确保行为准确。例如,测试 RoadSign.Move 到 TrafficSignal.Go 的转换,可及早发现遗漏。

名称转换策略简化命名差异映射

当源和目标枚举仅命名约定不同时,可使用 @EnumMapping 的 nameTransformationStrategy 自动处理,如添加后缀、前缀、剥离后缀、剥离前缀以及大小写转换。这避免了为每个常量编写 @ValueMapping,减少了样板代码。但需注意,转换策略需与 configuration 配合,且可能影响所有常量,需确保符合预期。

灵活处理未知值与空值

对于源枚举中未映射的值,MapStruct 提供 ANY_REMAINING 和 ANY_UNMAPPED 选项,可将其映射到默认值。此外,使用 MappingConstants.NULL 可处理空源或空目标,而 THROW_EXCEPTION 可在遇到未映射或空值时抛出异常。这些机制让开发者能根据业务需求选择静默处理或快速失败,但需注意 ANY_REMAINING 和 ANY_UNMAPPED 一次只能使用一个。

枚举与其他类型映射的注意事项

MapStruct 支持枚举与字符串、整数等类型间的映射。映射到字符串时,可用 @ValueMapping 指定目标字符串;映射到整数时,由于多个构造函数可能导致歧义,建议使用默认方法或包装类。例如,通过默认方法将 TrafficSignal 转换为整数,或定义包含整数属性的包装类。这确保了类型安全并避免了编译错误。

❓

Q&A

MapStruct是什么,它的主要用途是什么?

MapStruct是一个用于在REST API响应映射中映射枚举的工具,主要用于将外部API状态代码转换为应用程序的内部状态枚举。

如何使用@ValueMapping注释进行枚举映射?

通过使用@ValueMapping注释,可以将源枚举中的常量映射到目标枚举中具有不同名称的常量,例如将源枚举的'Go'映射到目标枚举的'Move'。

MapStruct如何处理未知的枚举值?

MapStruct可以通过设置默认值、处理空值或抛出异常来处理未知的枚举值。

如何将字符串映射到枚举值?

可以使用@ValueMapping将字符串映射到枚举值,例如将'add'映射到Operation.ADD。

MapStruct支持哪些类型的映射?

MapStruct支持将枚举映射到字符串、整数或其他数字类型,并可以处理枚举与其他类型之间的映射。

如何处理空值映射?

可以使用MappingConstants.NULL处理空源和空目标,确保在映射时正确处理空值。

➡️

继续阅读