Per mappare un certo oggetto con mapstruct ho bisogno di un po 'di post-elaborazione personalizzato che ha bisogno di un ulteriore parametro per fare è un lavoro:Mappa una collezione con il parametro con 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());
}
}
}
}
Questo funziona bene. Il problema inizia quando aggiungo seguente metodo a questo mapper:
public abstract ArrayList<AlertConfigActionTO> mapList (List<AlertConfigAction> actions, Locale userLanguage);
ho bisogno di passare questo parametro (LinguaUtente) così, ma mapstruct sembra 'abbattere', in questo caso: mi genera seguente codice per questa parte (che dà naturalmente un errore di compilazione):
@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;
}
sono sicuro che è legato al parametro poiché se lo cancello (da tutti i metodi di mappatura), allora il metodo di lista mappe viene generato correttamente.
Cosa è necessario fare per consentire i parametri personalizzati in questo caso?
Grazie, creato https://github.com/mapstruct/mapstruct/issues/809 –
FYI: Poiché avevo già creato una facciata come wrapper per i mappatori effettivi (per disaccoppiare il codice più dall'attuale implementazione del mapper) Ho semplicemente scorrere l'elenco di singoli elementi (AlertConfigAction) e mapparli singolarmente. Ogni volta che questa funzione è supportata, posso semplicemente aggiornare la facciata. –