【问题标题】:Mapstruct self defined mapper AND automatically generated oneMapstruct 自定义映射器并自动生成一个
【发布时间】:2017-11-09 22:25:33
【问题描述】:

我了解Mapstruct 允许我定义自己的映射器逻辑,我这样做是这样的:

@Mapper(componentModel = "spring")
public abstract class ProjectMapper {

    public ProjectInfo map(ProjectEntity projectEntity) {
        ProjectInfo projectInfo = new ProjectInfo();
        projectInfo.setName(projectEntity.getName());
        projectInfo.setDescription(projectEntity.getDescription());

        // Specific logic that forces me to define it myself
        if (projectEntity.getId() != null) {
            projectInfo.setId(projectEntity.getId());
        }
        if (projectEntity.getOrganisation() != null) {
            projectInfo.setOrganisation(projectEntity.getOrganisation().getName());
        }
        return projectInfo;
    }
}

它工作得很好,但我也想要Mapstruct 生成的映射器,但它们必须在接口中定义,有没有办法将这两种映射器类型分组?

【问题讨论】:

  • MapStructs 映射器必须在接口中定义是什么意思?您也可以在abstract 类中定义主题,MapStruct 将实现所有抽象方法。我不确定你的具体逻辑是否真的像它看起来的那样,但MapStruct 可以生成完全相同的方法。

标签: java mapper mapstruct


【解决方案1】:

注意:未经测试。我在使用 MapStruct 版本 1.0.0.Final 的 Spring-Boot 项目中使用了以下解决方案。

自定义标准映射流程为fairly well documented

自定义映射的方法之一是'AfterMapping' and 'BeforeMapping' hooks

@Mapper
public abstract class ProjectMapperExtension {

    @AfterMapping
    public void mapProjectEntityToProjectInfo(ProjectEntity projectEntity, @MappingTarget ProjectInfo projectInfo) {

        if (projectEntity.getId() != null) {
            projectInfo.setId(projectEntity.getId());
        }

        if (projectEntity.getOrganisation() != null) {
            projectInfo.setOrganisation(projectEntity.getOrganisation().getName());
        }
    }
}

然后用uses注释标准映射器接口,并从标准映射中排除自定义映射字段:

@Mapper(componentModel = "spring", uses = {ProjectMapperExtension.class})
public interface ProjectMapper {

    @Mapping(target = "id", ignore = true)
    @Mapping(target = "organisation", ignore = true)
    ProjectInfo mapProjectEntityToProjectInfo(ProjectEntity projectEntity);
}

【讨论】:

    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2023-01-31
    相关资源
    最近更新 更多