MapStruct не сопоставляет вложенные поля без явных сопоставлений при наличии нескольких исходных параметров.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 MapStruct не сопоставляет вложенные поля без явных сопоставлений при наличии нескольких исходных параметров.

Сообщение Anonymous »

У меня есть два похожих класса DTO и преобразователь MapStruct. При сопоставлении одного объекта с дополнительными параметрами String вложенные поля не сопоставляются автоматически — они становятся нулевыми, если они не определены явно.
Важный контекст: этот упрощенный пример иллюстрирует реальную проблему в моем проекте, когда мне приходится писать 14 явных аннотаций @Mapping только для сопоставления вложенных полей, которые должны быть сопоставлены автоматически. Я ищу способ избежать этого шаблона.
Исходные классы:

Код: Выделить всё

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class MyHome {
private Bathroom bathroomInfo;
private Bedroom bedroomInfo;
private Kitchen kitchenInfo;

@Getter @Setter @AllArgsConstructor @NoArgsConstructor
public static class Bathroom { private String shower; }

@Getter @Setter @AllArgsConstructor @NoArgsConstructor
public static class Bedroom { private String bed; }

@Getter @Setter @AllArgsConstructor @NoArgsConstructor
public static class Kitchen { private String diningTable; }
}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class MyFriendHome {
private Bathroom bathroomInfo;
private Bedroom bedroomInfo;
private Kitchen kitchenInfo;

@Getter @Setter @AllArgsConstructor @NoArgsConstructor
public static class Bathroom {
private String shower;
private String nightstand;
private String sink;
}

@Getter @Setter @AllArgsConstructor @NoArgsConstructor
public static class Bedroom { private String bed; }

@Getter @Setter @AllArgsConstructor @NoArgsConstructor
public static class Kitchen { private String diningTable; }
}
Интерфейс картографа:

Код: Выделить всё

@Mapper(
componentModel = MappingConstants.ComponentModel.SPRING,
unmappedTargetPolicy = ReportingPolicy.ERROR
)
public interface HomeMapper {

@Mapping(target = "bathroomInfo.shower", source = "myHome.bathroomInfo.shower")
@Mapping(target = "bathroomInfo.nightstand", source = "nightstand")
@Mapping(target = "bathroomInfo.sink", source = "sink")
MyFriendHome toMyFriendHome(MyHome myHome, String nightstand, String sink);
}
Использование:

Код: Выделить всё

@GetMapping
public MyFriendHome getMyFriendHome() {
MyHome home = new MyHome(
new MyHome.Bathroom("shower"),
new MyHome.Bedroom("bed"),
new MyHome.Kitchen("kitchen")
);
return homeMapper.toMyFriendHome(home, "nightstand", "sink");
}
Проблема:

Если я удалю явное сопоставление для ванной комнатыInfo.shower:

Код: Выделить всё

// @Mapping(target = "bathroomInfo.shower", source = "myHome.bathroomInfo.shower")
Поле душа становится нулевым в результате. Заполняются только тумбочка и раковина. Тем не менее, BedroomInfo и KitchenInfo (которые имеют совпадающие имена и типы полей) сопоставляются автоматически без каких-либо явных сопоставлений.
В моем реальном проекте это заставляет меня писать многочисленные аннотации @Mapping для полей, которые должны автоматически сопоставляться по соглашению.
Вопрос:

Почему MapStruct не отображает автоматически myHome.bathroomInfo.shower в ванная комнатаInfo.shower при наличии нескольких исходных параметров и успешно сопоставляет другие вложенные объекты (

Код: Выделить всё

bedroomInfo
, KitchenInfo)?
Это ожидаемое поведение при наличии нескольких исходных параметров? Как мне настроить сопоставитель для автоматической обработки сопоставлений вложенных полей в этом сценарии и избежать написания десятков явных аннотаций @Mapping?

Подробнее здесь: https://stackoverflow.com/questions/798 ... tiple-sour
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»