返回

MapStruct 映射抽象类列表属性:轻松实现接口与类间的映射

java

使用 MapStruct 映射抽象类列表属性:完整指南

引言

在使用 Java 进行开发时,我们需要频繁地将对象从一种类型映射到另一种类型。MapStruct 是一款出色的映射框架,它使用注解和编译时处理来简化这一过程。然而,当遇到需要映射抽象类列表的场景时,开发人员可能会遇到一些问题。

问题:映射抽象类列表属性

当试图映射一个具有抽象类列表属性的 DTO 时,你可能会遇到以下错误:

返回类型 AbstractQuestionnaireDTO 是一个抽象类或接口

解决方案:工厂方法

要解决这个问题,我们需要使用 MapStruct 的工厂方法机制。该机制允许你为抽象类提供具体的实现。

步骤 1:定义工厂方法

定义一个工厂方法来创建抽象类列表的具体实现。以下是针对 AbstractQuestionnaireDTO 定义的工厂方法示例:

@Mapper(componentModel = "spring")
public interface PsychologicalSupportProcessMapper {
    List<PsychologicalSupportProcessDTO> toDtoList(List<PsychologicalSupportProcess> psp);

    // 工厂方法
    default AbstractQuestionnaireDTO map(AbstractQuestionnaireDTO abstractQuestionnaireDTO) {
        if (abstractQuestionnaireDTO instanceof PsyFactorsExtraDTO) {
            return new PsyFactorsExtraDTO();
        } else if (abstractQuestionnaireDTO instanceof PsyFactorsIntraDTO) {
            return new PsyFactorsIntraDTO();
        } else {
            throw new IllegalArgumentException("Unsupported AbstractQuestionnaireDTO type: " + abstractQuestionnaireDTO.getClass().getName());
        }
    }
}

步骤 2:调整服务方法

在服务方法中,使用工厂方法来映射抽象类列表:

@Override
public List<PsychologicalSupportProcessDTO> findAll() {
    List<PsychologicalSupportProcess> psychologicalSupportProcess = this.questionnaireService.findAll();
    List<PsychologicalSupportProcessDTO> psychologicalSupportProcessDTO = psp.toDtoList(psychologicalSupportProcess);
    return psychologicalSupportProcessDTO;
}

何时使用 MapStruct

使用 MapStruct 进行映射具有以下优点:

  • 简化映射代码: MapStruct 自动生成类型安全的映射代码,消除手动编写的需求。
  • 类型安全: MapStruct 保证生成的映射代码是类型安全的,防止类型不匹配错误。
  • 可维护性: MapStruct 维护映射代码与底层对象模型之间的同步,简化维护。

结论

通过使用工厂方法,我们成功解决了使用 MapStruct 映射抽象类列表属性的问题。遵循这些步骤,你可以轻松实现抽象类和接口的映射,提高开发效率和代码质量。

常见问题解答

  • 为什么 MapStruct 无法直接映射抽象类? MapStruct 需要具体的实现细节才能进行映射。抽象类不提供此类细节。
  • 工厂方法如何工作? 工厂方法根据抽象类的具体类型返回一个实现。
  • 我可以在哪里找到 MapStruct 的文档? 有关 MapStruct 的全面文档,请访问官方网站:https://mapstruct.org/documentation/
  • 有什么替代 MapStruct 的框架? 除了 MapStruct,还有一些其他映射框架,例如 ModelMapper 和 Dozer。
  • 如何选择合适的映射框架? 选择映射框架时,考虑因素包括映射复杂性、性能和支持的特性。