java - 如何通过使用-MapStruct从源对象复制值来填充目标对象内的地图?
问题描述
我是 Mapstruct 的新手。我有一个场景,在我的目标对象中,我有一个带有键值对<String,String> 的 java 映射,我必须使用源对象内部对象属性/数据成员值来填充这个映射。
我的代码类似于波纹管(虚拟代码):
public class Student {
public String name;
public String rollNo;
public Map<String, String> marks;
}
public class ExamResult{
public String stud_name;
public String Stud_rollNo;
public Marks marks;
}
public class Marks{
public Integer English;
public Integer Maths;
public Integer Science;
}
我将如何手动实现如下相同的事情:
Student target;
ExamResult source;
target.setName(source.stud_name);
target.setRollNo(source.Stud_RollNo);
target.marks.put("ENGLISH",source.marks.english_marks);
target.marks.put("MATHS",source.marks.math_marks);
target.marks.put("SCIENCE",source.marks.science_marks);
对于直接属性映射,我找到了代码,但不确定如何映射要填充到映射中的值marks
。
我曾考虑过使用 java 表达式来填充目标映射值,但没有找到任何文档或此类用于目标对象的表达式示例。
我想像下面这样使用,但不确定它会起作用:
@Mapping(source = "stud_name", target = "name")
@Mapping(source = "Stud_RollNo", target = "rollNo")
@Mapping(source = "source.marks.english_marks",target = "java( marks.put(\"ENGLISH\",source.marks.english_marks )")
@Mapping(source = "source.marks.math_marks",target = "java( marks.put(\"MATHS\",source.marks.math_marks )")
@Mapping(source = "source.marks.science_marks",target = "java( marks.put(\"SCIENCE\",source.marks.science_marks )")
Student doConvert(ExamResult src)
感谢任何帮助、任何建议或任何解决方法。提前致谢。
解决方案
MapStruct 不允许使用表达式target
,这就是为什么你不能让它工作的原因。
还不支持从对象映射到地图,我们有不同的问题需要此功能。
我的建议是尽可能多地使用自动映射,然后@AfterMapping
在 MapStruct 无法做到这一点时使用。所以在你的情况下是这样的:
@Mapper
public interface StudentMapper {
@Mapping(source = "stud_name", target = "name")
@Mapping(source = "Stud_RollNo", target = "rollNo")
@Mapping(target = "marks", ignore = true) // mapped in @AfterMapping
Student doConvert(ExamResult src)
@AfterMapping
default void addStudentMarks(ExamResult result, @MappingTarget Student student) {
student.marks = new HashMap<>();
student.marks.put("ENGLISH", result.marks.ENGLISH);
student.marks.put("MATHS", result.marks.MATHS);
student.marks.put("SCIENCE", result.marks.SCIENCE);
}
}
推荐阅读
- graphql - useQuery:数据未定义
- javascript - 如何在 React/React Native 的地图组件列表中独立设置状态
- reactjs - 使用 Expo 输入照片
- java - 使用 AsyncTask 转换代码以使用 Executor Service
- c++ - 我想使用这些功能反转文本,但我不知道出了什么问题
- amazon-s3 - S3 托管网站只能通过私有端点访问
- python - 键盘出现kivy时的事件
- android - 未使用 Android WebView 生成 PDF
- python - 如何使用 Python CLI 在 github 存储库中创建包含内容的文件
- c++17 - 使用 O_EXCL 创建文件的 C++ iostream 是什么?