MapStruct ordnet verschachtelte Felder ohne explizite Zuordnungen nicht zu, wenn mehrere Quellparameter vorhanden sindJava

Java-Forum
Anonymous
 MapStruct ordnet verschachtelte Felder ohne explizite Zuordnungen nicht zu, wenn mehrere Quellparameter vorhanden sind

Post by Anonymous »

Ich habe zwei ähnliche DTO-Klassen und einen MapStruct-Mapper. Bei der Zuordnung von einem Objekt mit zusätzlichen String-Parametern werden verschachtelte Felder nicht automatisch zugeordnet – sie werden null, sofern nicht explizit definiert.
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; }
}
Mapper-Schnittstelle:

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);
}
Verwendung:

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");
}
Problem:

Wenn ich die explizite Zuordnung für BathroomInfo.shower entferne:

Code: Select all

// @Mapping(target = "bathroomInfo.shower", source = "myHome.bathroomInfo.shower")
Das Feld Dusche wird im Ergebnis null. Nur Nachttisch und Waschbecken werden bestückt. SchlafzimmerInfo und kitchenInfo (die über übereinstimmende Feldnamen und -typen verfügen) werden jedoch automatisch ohne explizite Zuordnungen zugeordnet.
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

bedroomInfo
, kitchenInfo)?
Ist 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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post