java - Mapstruct 自定义映射器并自动生成一个

标签 java mapper mapstruct

我明白 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 生成的映射器,但它们必须在接口(interface)中定义,有没有办法将这两种映射器类型分组?

最佳答案

注意:未经测试。我在使用 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 注释标准映射器接口(interface),并从标准映射中排除自定义映射字段:

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

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

关于java - Mapstruct 自定义映射器并自动生成一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44431750/

相关文章:

hadoop - mapper 和 reducer 函数的输出到底是什么

r - 在hadoop系统中实现R程序

spring - MapStruct 映射器未在 Spring 单元测试中注入(inject)

java - 如何在 JUnit5 中模拟 MapStruct 嵌套映射器

gradle - Mapstruct 与 Intellij 和 Gradle 一起使用时不会生成 BeanMapperImpl.java

java - Spring data Ldap Repository 在使用 findAll 时返回 empry List

java - 如何合并两个扩展不同类的 Activity ?

java - 以编程方式启用或禁用 TestNG 中的断言

java - 自定义JFileChooser : FileFilters lost

Hadoop 流 : single file or multi file per map. 不要拆分