Wichtiger Kontext: Dieses vereinfachte Beispiel veranschaulicht ein echtes Problem in meinem Projekt, bei dem ich 14 explizite @Mapping-Anmerkungen schreiben muss, nur um verschachtelte Felder zuzuordnen, die automatisch zugeordnet werden sollen. Ich suche nach einer Möglichkeit, dieses Muster zu vermeiden.
Quellklassen:
Code: Select all
@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; }
}
Code: Select all
@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);
}
Code: Select all
@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");
}
Wenn ich die explizite Zuordnung für BathroomInfo.shower entferne:
Code: Select all
// @Mapping(target = "bathroomInfo.shower", source = "myHome.bathroomInfo.shower")
In meinem aktuellen Projekt zwingt mich dies dazu, zahlreiche @Mapping-Anmerkungen für Felder zu schreiben, die gemäß Konvention automatisch zugeordnet werden sollten.
Frage:
Warum wird MapStruct nicht automatisch zugeordnet? myHome.bathroomInfo.shower zu BathroomInfo.shower, wenn mehrere Quellparameter vorhanden sind, während andere verschachtelte Objekte erfolgreich zugeordnet werden (
Code: Select all
bedroomInfoIst dieses Verhalten bei mehreren Quellparametern zu erwarten? Wie kann ich den Mapper so konfigurieren, dass er in diesem Szenario verschachtelte Feldzuordnungen automatisch verarbeitet und das Schreiben Dutzender expliziter @Mapping-Annotationen vermeidet?
Mobile version