当前位置: 首页 > 知识库问答 >
问题:

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

范玄裳
2023-03-14

我有一个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和常规应用程序都扩展了App,因此我有根据isCustom字段调用转换器的main Converter。

问题是,当我尝试构建这个时,我得到了一个模糊的映射错误,因为main Converter、ConvertNorarApplication和ConvertCustomApplication都从Application DTO映射到App(或App的子类)。所以转换应用程序不知道使用什么。有什么方法我可以明确地告诉它调用main Converter吗?我想要像@Map(合格的ByName="main Converter")这样的东西,我把它放在转换应用程序之上,(但它当然不起作用)有人知道我如何做到这一点吗?谢谢!

共有1个答案

叶文博
2023-03-14

为了实现您正在寻找的内容,您需要使用IterableMap#合格的ByName

此属性旨在增强列表的选择。

例如

    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);

您正在制作合格的方法。然而,该方法似乎已经重定向到更具体的方法。因此,我建议对其他两种方法进行限定,并从主转换器中删除限定。那么你就不需要为iterable映射做任何事情了。

例如

    @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);
 类似资料:
  • 这是我的例子。 我希望toDto方法使用toDto将Employee映射到EmployeeDto,但mapstruct会生成employeeDtoToEmployeeDto方法。我该怎么修? 谢谢

  • 我有简单的对象客户端

  • 我有两种将实体映射到域的方法。 当我试图定义实体列表到域的映射方法时,我发现了用于映射集合元素的模糊映射方法。 有没有一种方法可以定义用于映射对象集合的方法

  • 我使用以下映射器映射实体: 对于映射为集合的实体,我只需要忽略“数据”字段。但看起来仅适用于单个实体。我还注意到生成的方法只是在for循环中使用。对此有什么解决方案吗?

  • 我得到以下情况: 源类: null

  • 我正在使用MapStruct从一个JPA实体映射到一个POJO DTO,在一个带有依赖项注入的Spring应用程序中。 ...并且从不为集合中的项调用修饰方法。 有没有一种方法可以让Mapstruct在集合映射中使用decorator方法,而不是在我的decorator中手动编写集合方法(这种方法很有效,但很冗长,并且违背了Mapstruct最初的目的,即不必编写这种代码)?