Важный контекст: этот упрощенный пример иллюстрирует реальную проблему в моем проекте, когда мне приходится писать 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")
В моем реальном проекте это заставляет меня писать многочисленные аннотации @Mapping для полей, которые должны автоматически сопоставляться по соглашению.
Вопрос:
Почему MapStruct не отображает автоматически myHome.bathroomInfo.shower в ванная комнатаInfo.shower при наличии нескольких исходных параметров и успешно сопоставляет другие вложенные объекты (
Код: Выделить всё
bedroomInfoЭто ожидаемое поведение при наличии нескольких исходных параметров? Как мне настроить сопоставитель для автоматической обработки сопоставлений вложенных полей в этом сценарии и избежать написания десятков явных аннотаций @Mapping?
Подробнее здесь: https://stackoverflow.com/questions/798 ... tiple-sour
Мобильная версия