Обратное отображение с пользовательским картографом с mapstruct - PullRequest
1 голос
/ 08 февраля 2020

У меня отображение определено как

@Mapping(source = "diagnoses", target = "diagnosisCode", qualifiedByName = "mapDiagnosisCodeAsList")

Где mapDiagnosisCodeAsList определяется следующим образом:

@Named("mapDiagnosisCodeAsList")
default List<String> retrieveDiagnosisCodeAsList(List<Diagnosis> aList) {
    if (CollectionUtils.isEmpty(aList)) {
        return new ArrayList<>();
    }
    return aList.stream().map(Diagnosis::getDiagnosisCode).collect(Collectors.toList());
}

Обратные отображения обрабатываются с использованием @InheritInverseConfiguration. Как указать пользовательское сопоставление для обратного сопоставления?

1 Ответ

2 голосов
/ 08 февраля 2020

Чтобы обратное сопоставление работало, вам также необходимо указать обратный метод.

@Named("mapDiagnosisCodeAsList")
default List<Diagnosis> retrieveDiagnosisCodeAsList(List<String> aList) {
    if (CollectionUtils.isEmpty(aList)) {
        return new ArrayList<>();
    }
    return aList.stream().map(Diagnosis::new).collect(Collectors.toList());
}

Еще одна заметка. Я думаю, что вам действительно не нужна сложность квалификаторов, чтобы сделать эту работу. Если у вас есть только один Diagnosis до String и наоборот, вы можете сделать это без квалификаторов (даже без списка).

Ваш @Mapping останется прежним без qualifiedByName, и вам необходимо предоставить отображение от Diagnosis до String и обратно.

default String diagnosisToString(Diagnosis diagnosis) {
    return diagnosis == null ? null : diagnosis.getDiagnosisCode();
}

default Diagnosis stringToDiagnosis(String diagnosisCode) {
    return diagnosis == null ? null : new Diagnosis(diagnosisCode);
}

Создание коллекции будет осуществляться MapStruct. Также я предполагаю, что Diagnosis имеет конструктор, который принимает код.

...