使用带有 mapstruct 的自定义映射器进行逆向映射

Inverse mapping with custom mapper with mapstruct

我有一个映射定义为

@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 处理逆向映射。如何为逆向映射指定自定义映射?

为了使反向映射起作用,您还需要提供反向方法。

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

另一个旁注。我认为您并不真的需要限定词的复杂性来完成这项工作。如果你只有一个 DiagnosisString 和反向你可以不用限定符(即使没有列表)。

如果没有 qualifiedByName,您的 @Mapping 将保持不变,您需要提供从 DiagnosisString 和反向的映射。

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 有一个接受代码的构造函数。