java MapStruct:外部化自定义Map方法导致限定符错误

vfh0ocws  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(891)

我正在尝试在外部类中创建自定义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);
    }

}

我错过了什么?

vsnjm48y

vsnjm48y1#

看起来使用@NamedqualifiedByName实现时,MapperUtilsCustomerAccountMapper位于完全相同的软件包中时,qualifiedByName才起作用
Mapstruct文档提到使用qualifiedByName不是最好的方法,因为它不是很可预测
虽然使用的机制是相同的,但是用户必须更加小心。在IDE中重构已定义限定符的名称也会巧妙地重构所有其他出现的限定符。很明显,更改名称的情况并非如此。
也来自qualifiedByName Java文档
请注意,基于注解的限定符通常更可取,因为它们更容易找到引用,并且对于重构来说是安全的,但是当需要大量限定符时,基于名称的限定符可能是一个不太冗长的替代方案,因为不需要自定义注解类型。

相关问题