简体   繁体   中英

Inverse mapping with custom mapper with mapstruct

I have a mapping defined as

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

Where mapDiagnosisCodeAsList is defined as follows:

@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());
}

Inverse mappings are handled using @InheritInverseConfiguration . How do I specify a custom mapping for the inverse mapping?

In order for the inverse mapping to work you'll need to provide the inverse method as well.

@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());
}

One other side note. I think that you don't really need the complexity of qualifiers to make this work. If you have only one Diagnosis to String and reverse you can do it without qualifiers (even without the list).

Your @Mapping will stay the same without qualifiedByName and you need to provided mapping from Diagnosis to String and reverse.

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

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

The creation of the collection would be taken care by MapStruct. Also I assume that Diagnosis has a constructor that takes the code.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM