Как указать метод сопоставления по умолчанию для Mapstruct

#java #mapping #mapstruct

#java #сопоставление #mapstruct

Вопрос:

У меня есть простой объектный клиент

 public class Client {
    String externalCode;
    String name;
    String surname;
}
 

И я хочу сопоставить его с почти идентичным объектом

 public class User {
    String internalCode;
    String name;
    String surname;
}
 

Видите ли, я хочу, чтобы ExternalCode был сопоставлен с internalCode. И у меня есть метод, который это делает. Я пометил свой метод своей пользовательской аннотацией @CodeMapping и поместил эту аннотацию в параметр qualifiedBy. Итак, вот мой картограф.

 @Mapper()
ClientMapper {
     @CodeMapping
     String toInternalCode(String externalCode) {
          return externalCode   " internal part";
     }

    @Mapping(target = "internalCode", source = "externalCode", qualifiedBy = CodeMapping.class)
    User toUser(Client client);
}
 

Проблема в том, что поля имени и фамилии также сопоставляются с использованием метода toInternalCode. Mapstruct видит, что я определил метод, который сопоставляет строку со строкой, и считает, что его следует использовать во всех случаях.

Есть ли способ сообщить Mapstruct, что если квалификаторы не указаны, следует использовать прямое сопоставление? Или создать свой собственный метод, который принимает string и возвращает его и сообщает Mapstruct, что он должен использовать этот метод по умолчанию?

Ответ №1:

Скорее toInternalCode всего, используется всеми методами, потому @CodeMapping что аннотация не является мета-аннотированной с @Qualifier помощью (from org.mapstruct.Qualifier ).

Он @CodeMapping должен быть определен следующим образом:

 import org.mapstruct.Qualifier;

@Qualifier
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface CodeMapping {
}