#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 {
}