Возможно ли, чтобы в моем интерфейсе mapper было несколько методов, почти одинаковых, но с разными возвращаемыми объектами?

#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);
}