首页 > 解决方案 > 如何通过使用-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)

感谢任何帮助、任何建议或任何解决方法。提前致谢。

标签: javamapstructdto-mapping

解决方案


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

}

推荐阅读