我有一个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,(但它当然不工作)有人知道我怎么做吗?谢谢!
为了实现你正在寻找的东西,你将需要使用下面的函数。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);