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

时间:2020-02-07 22:29:34

标签: java 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处理。如何为逆映射指定自定义映射?

1 个答案:

答案 0 :(得分:2)

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

@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并反转,则可以不使用限定符(甚至没有列表)也可以。

如果没有@Mapping,您的qualifiedByName将保持不变,并且您需要提供从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有一个接受代码的构造函数。