使用Mapstruct映射一个集合,并为单个实例指定方法?

问题描述 投票:0回答:1

我有一个mapstruct类,它的功能如下。

    abstract CustomApplication convertCustomApplication(ApplicationDTO source);

    abstract RegularApplication convertRegularApplication(ApplicationDTO source);

    @Named("mainConverter")
    public App mainConverter(ApplicationDTO source) {
        return source.isCustom() ? convertCustomApplication(source) : convertRegularApplication(source);
    }

    //@Mapping( qualifiedByName = "mainConverter")
    abstract public List<App> convertApplications(List<ApplicationDTO> applicationList);

CustomApplication和RegularApplication都扩展了App,所以我有mainConverter,根据isCustom字段调用转换器。

问题是,当我试图构建这个时,我得到了一个模棱两可的映射错误,因为mainConverter、convertRegularApplication和convertCustomApplication都是从ApplicationDTO映射到App(或App的子类)。所以convertApplications不知道该用什么,有什么办法可以明确地告诉它调用mainConverter吗?我想要像@Mapping( qualifiedByName = "mainConverter")这样的东西,我把上面的convertApplications,(但它当然不工作)有人知道我怎么做吗?谢谢!

collections mapstruct
1个回答
0
投票

为了实现你正在寻找的东西,你将需要使用下面的函数。IterableMapping#qualifiedByName.

这个属性是为了加强对列表的选择。

例如

    abstract CustomApplication convertCustomApplication(ApplicationDTO source);

    abstract RegularApplication convertRegularApplication(ApplicationDTO source);

    @Named("mainConverter")
    public App mainConverter(ApplicationDTO source) {
        return source.isCustom() ? convertCustomApplication(source) : convertRegularApplication(source);
    }

    @IterableMapping(qualifiedByName = "mainConverter")
    abstract public List<App> convertApplications(List<ApplicationDTO> applicationList);

替代方案

你在做你的 mainConverter 的限定方法。但是,看起来该方法已经重定向到更具体的方法。因此,我建议对另外两个方法进行限定,并将限定条件从 mainConverter. 那么你就不需要为可迭代映射做任何事情。

例如

    @Named("customApplication")
    abstract CustomApplication convertCustomApplication(ApplicationDTO source);

    @Named("regularApplication")
    abstract RegularApplication convertRegularApplication(ApplicationDTO source);

    public App mainConverter(ApplicationDTO source) {
        return source.isCustom() ? convertCustomApplication(source) : convertRegularApplication(source);
    }

    abstract public List<App> convertApplications(List<ApplicationDTO> applicationList);
© www.soinside.com 2019 - 2024. All rights reserved.