当前位置: 首页 > 知识库问答 >
问题:

如何使用-mapstruct从源对象复制值来填充目标对象内部的映射?

涂选
2023-03-14

我对MapStruct是新手。我有一个场景,在我的目标对象中,我有一个带有键值对 的java映射,我必须使用源对象内部的对象属性/数据成员值来填充这个映射。

我的代码类似于bellow(虚拟代码):

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

我如何像Bellow一样手动实现相同的事情:

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

任何帮助,任何建议或任何变通方法都是感激的。提前谢了。

共有1个答案

谷梁昊空
2023-03-14

MapStruct不允许在target中使用表达式,这就是为什么不能使其工作。

从对象映射到地图也不支持,我们有不同的问题要求这个功能。

我建议尽可能多地使用自动映射,然后在MapStruct做不到的时候使用@aftermapping。所以在您的例子中,类似于:

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

}
 类似资料:
  • 我有一个要填充信息的对象。我从许多不同的服务中检索信息。我做了一个助手类,它有一个公共方法,然后有许多私有方法来调用服务。我写的东西很好,但我不确定这是否是正确的方法。 您可能想知道为什么我需要一个包含所有这些信息的对象。我需要它全部在一个对象中,因为我从这个java对象创建了一个json对象并将其传递给javascript层。 我的方法有什么问题?我是否应该遵循一种编程范式来做这样的事情? 例子

  • 但是它包含了很多样板代码(在@Mapping注释中),我怎么能对mapper说我想要将source.user映射到这个目标而不指定target的字段呢?

  • 假设我有这样的映射: 现在,我需要将子列表映射到子列表,但它们都有相同的父对象。我希望这样做: 但不管用,有机会做吗?

  • 我是MapStruct的新手,我试图映射目标类中的对象列表,其中as源具有包括其他字符串变量在内的单个值。自定义实现也没有运气。请执行的任何建议

  • 问题内容: 根据http://www.newtonsoft.com/json/help/html/PopulateObject.htm,您可以通过JSON字符串中定义的值来更新现有实例。我的问题是,我必须填充该对象的数据已经被解析为JToken对象。我当前的方法如下所示: 是否有更好的方法来完成此任务,而不必首先还原在创建JToken时已经完成的解析? 问题答案: 使用阅读器并将其传递给。返回的阅