#java #mapstruct
Вопрос:
Возможно ли, например, иметь 2 метода в моем интерфейсе картографа, почти одинаковые, но с другим возвращаемым объектом (с меньшим количеством полей)? Я создал дополнительный объект DTO, который меньше исходного объекта (например. Мысмальдо). Нужно ли мне создавать новый интерфейс картографа или я могу повторно использовать логику в моем существующем картографе?
public interface SearchDtoMapper {
@Mapping(target = "lPlace", source = "route", qualifiedByName = "SpotToLPlace")
@Mapping(target = "uPlace", source = "route", qualifiedByName = "SpotToUPlace")
MyBigDto map(Route route);
В том же картографе я хочу иметь что-то вроде:
@Mapping(target = "lPlace", source = "route", qualifiedByName = "SpotToLPlace")
@Mapping(target = "uPlace", source = "route", qualifiedByName = "SpotToUPlace")
MySmallDto map(Route route);
Комментарии:
1. MapStruct может генерировать два метода, но компилятор Java сочтет их неоднозначными, потому что у них одинаковое имя и параметры. Но вам не нужен новый интерфейс, вам просто нужно изменить имя метода.
2. Эти два метода должны, по крайней мере, иметь разные названия. В Java класс или интерфейс не может иметь два метода с одинаковым именем и одинаковым количеством аргументов с одинаковым типом и иметь только другой тип возвращаемого значения.
3. хорошо, я думал, что разрешено только название «карта».
4. Имя методов не имеет значения для MapStruct, вы можете дать методам любое имя, которое вам нравится.
Ответ №1:
MapStruct может иметь столько методов с таким количеством исходных и возвращаемых типов, сколько вы хотите.
Поэтому в вашем примере вы можете сделать что-то вроде:
public interface SearchDtoMapper {
@Mapping(target = "lPlace", source = "route", qualifiedByName = "SpotToLPlace")
@Mapping(target = "uPlace", source = "route", qualifiedByName = "SpotToUPlace")
MyBigDto map(Route route);
@Mapping(target = "lPlace", source = "route", qualifiedByName = "SpotToLPlace")
@Mapping(target = "uPlace", source = "route", qualifiedByName = "SpotToUPlace")
MySmallDto mapSmall(Route route);
}