1

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の生成されたマッパーも必要ですが、インターフェイスで定義する必要があります。これらのマッパー タイプの両方をグループ化する方法はありますか?

4

1 に答える 1

0

注: 未テスト。MapStruct バージョン 1.0.0.Final を使用して、Spring-Boot プロジェクトで次のソリューションを 1 回使用しました。

標準マッピング プロセスのカスタマイズについては、十分に文書化されています

マッピングをカスタマイズする方法の 1 つは、'AfterMapping' および 'BeforeMapping' フックです。

@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);
}
于 2017-06-08T12:04:12.597 に答える