Um ein bestimmtes Objekt mit mapstruct Karte Ich brauche eine individuelle Nachbearbeitung, die einen zusätzlichen Parameter benötigt, es zu tun ist Arbeit:Karte eine Sammlung mit dem Parameter mit mapstruct
@Mapper
public abstract class AlertConfigActionMapper {
@Mappings({ @Mapping(target = "label", ignore = true)})
public abstract AlertConfigActionTO map (AlertConfigAction action, Locale userLanguage);
@AfterMapping
public void setLabel (AlertConfigAction action, @MappingTarget AlertConfigActionTO to, Locale userLanguage) {
for (AlertConfigActionLabel label : action.getAlertConfigActionLabels()) {
if (label.getLanguage().equals(userLanguage)) {
to.setLabel(label.getLabel());
break;
} else if (label.getLanguage().equals(Locale.ENGLISH)) {
to.setLabel(label.getLabel());
}
}
}
}
Das funktioniert ganz gut. Das Problem beginnt, wenn ich folgende Methode zu diesem Mapper hinzufügen:
public abstract ArrayList<AlertConfigActionTO> mapList (List<AlertConfigAction> actions, Locale userLanguage);
Ich brauche diesen Parameter (userLanguage) als auch passieren, aber mapstruct scheint zu ‚brechen‘ in diesem Fall: Ich erzeugen für diese folgenden Code (was natürlich einen Übersetzungsfehler gibt):
@Override
public List<AlertConfigActionTO> mapList(List<AlertConfigAction> actions, Locale userLanguage) {
if (actions == null && userLanguage == null) {
return null;
}
List<AlertConfigActionTO> list = new List<AlertConfigActionTO>();
return list;
}
ich bin sicher, dass es auf den Parameter verwendet ist, da, wenn ich es entfernen (aus allen Mapping-Methoden), dann die mAPLIST Methode korrekt erzeugt wird.
Was muss getan werden, um benutzerdefinierte Parameter in diesem Fall zuzulassen?
Danke, erstellt https://github.com/mapstruct/mapstruct/issues/809 –
FYI: Da ich bereits eine Fassade als Wrapper für die tatsächlichen Mapper erstellt hatte (um den Code mehr von der tatsächlichen Mapper-Implementierung zu entkoppeln) Ich durchlaufe einfach die Liste der einzelnen Elemente (AlertConfigAction) und ordne sie einzeln zu. Wenn diese Funktion unterstützt wird, kann ich einfach die Fassade aktualisieren. –