使用带有 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());
}
另一个旁注。我认为您并不真的需要限定词的复杂性来完成这项工作。如果你只有一个 Diagnosis
到 String
和反向你可以不用限定符(即使没有列表)。
如果没有 qualifiedByName
,您的 @Mapping
将保持不变,您需要提供从 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
有一个接受代码的构造函数。
我有一个映射定义为
@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());
}
另一个旁注。我认为您并不真的需要限定词的复杂性来完成这项工作。如果你只有一个 Diagnosis
到 String
和反向你可以不用限定符(即使没有列表)。
如果没有 qualifiedByName
,您的 @Mapping
将保持不变,您需要提供从 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
有一个接受代码的构造函数。