我正在尝试在外部类中创建自定义Map器以将字符串Map到整数。在使用map方法的Map器中定义map方法时,该方法被成功调用。但当我将该方法放入外部类中时,我收到错误消息,即MapStruct无法找到该方法:error: Qualifier error. No method found annotated with @Named#value: [ MapperUtils and mapEnum ]. See https://mapstruct.org/faq/#qualifier for more info. @Mapping(target = "invoiceLanguage", source = "invoiceLanguage", qualifiedByName = {"MapperUtils", "mapEnum"})
这是Map器抽象类。注解代码包含成功调用的自定义Map方法。我希望将此方法外部化,以便能够从多个Map器调用它
@Mapper(componentModel = "spring", uses = MapperUtils.class, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public abstract class CustomerAccountMapper {
public abstract ExistingCustomerAccountDto map(CustomerAccountDao dao);
public abstract CustomerAccountDao map(NewCustomerAccountRequest request);
@Mapping(target = "invoiceLanguage", source = "invoiceLanguage",
qualifiedByName = {"MapperUtils", "mapEnum"})
public abstract CustomerAccountDao map(UpdateCustomerAccountRequest request);
// works fine when method is in mapper class
// @Named("mapEnum")
// Integer mapEnum(String input) {
// if ("null".equalsIgnoreCase(input)) {
// return null;
// }
// return Integer.valueOf(input);
// }
}
我已按照用户指南中的说明操作:
1.创建了具有自定义Map方法的外部类。将@Named
添加到类和方法中
1.已将uses
添加到Map程序类的@Mapper
注解
1.将qualifiedByName
添加到Map器方法上的@Mapping
注解
这是我的外部Map器类
@Component
@Named("MapperUtils")
@SuppressWarnings("unused")
public class MapperUtils {
@Named("mapEnum")
Integer mapEnum(String input) {
if ("null".equalsIgnoreCase(input)) {
return null;
}
return Integer.valueOf(input);
}
}
我错过了什么?
1条答案
按热度按时间vsnjm48y1#
看起来使用
@Named
和qualifiedByName
实现时,仅当MapperUtils
与CustomerAccountMapper
位于完全相同的软件包中时,qualifiedByName
才起作用Mapstruct
文档提到使用qualifiedByName
不是最好的方法,因为它不是很可预测虽然使用的机制是相同的,但是用户必须更加小心。在IDE中重构已定义限定符的名称也会巧妙地重构所有其他出现的限定符。很明显,更改名称的情况并非如此。
也来自
qualifiedByName
Java文档请注意,基于注解的限定符通常更可取,因为它们更容易找到引用,并且对于重构来说是安全的,但是当需要大量限定符时,基于名称的限定符可能是一个不太冗长的替代方案,因为不需要自定义注解类型。