【问题标题】:Nested list mapping using MapStruct使用 MapStruct 的嵌套列表映射
【发布时间】:2017-10-21 19:22:53
【问题描述】:

对于以下场景,我如何使用 MapStruct 进行 bean 映射。

class Source {
private String sourceId;
private List<Course> courses;  //always returns only one course
}

class Course {
private String courseName;
private List<Student> students; 
}

class Student {
private String studentName;
}

class Target {
private String targetId;
private String subjectName;
private List<Member> members;
}

class Member {
private String memberName;
}

现在我想将 sourceId 映射到 targetId,将 courseName 映射到 subjectName,将 studentName 映射到 memberName(列表到列表)。

【问题讨论】:

    标签: mapstruct


    【解决方案1】:

    首先Source 总是包含一个课程,为什么不将其设为Course 元素而不是List

    如果你这样做,映射会简单得多。根据您当前的设置,它有点复杂。

    @Mapper
    public interface MyMapper {
    
        @Mapping(target = "targetId", source = "sourceId")
        @Mapping(target = "subjectName", source = "courses")
        @Mapping(target = "members", source = "courses")
        Target map(Source source);
    
        default String subjectName(List<Course> courses) {
            if (courses == null || courses.isEmpty()) {
                return null;
            }
            return courses.get(0).getCourseName();
        }
    
        default List<Member> toMembersFromCourses(List<Course> courses) {
            if (courses == null || courses.isEmpty()) {
                return null;
            }
            return toMembers(courses.get(0).getStudents());
        }
    
        List<Member> toMembers(List<Student> students);
    
        @Mapping(target = "memberName", source = "studentName")
        Member toMember(Student student);
    }
    

    如果Course 不是列表。那么你可以用 1.2.0.Final 做得更优雅。

    @Mapper
    public interface MyMapper {
    
        @Mapping(target = "targetId", source = "sourceId")
        @Mapping(target = "subjectName", source = "course.courseName")
        @Mapping(target = "members", source = "course.students")
        Target map(Source source);
    
        @Mapping(target = "memberName", source = "studentName")
        Member toMember(Student student);
    }
    

    【讨论】:

    • 感谢您的详细回答。为什么课程是列表?这就是要求。您还可以使用映射器类的正确源代码更新答案。返回第一个 toMembers() 方法的成员列表而不是学生列表。
    • 我不认为我跟随。源代码返回一个List&lt;Member&gt;
    • 上述代码出现编译时错误。
    • 你是对的,它有编译错误。但不是因为它返回List&lt;Member&gt;。这是因为toMembers 方法都具有相同的擦除。我将第一个 toMembers 重命名为 toMembersFromCourses,现在它可以编译并生成正确的代码。如果您将第一个更改为返回List&lt;Student&gt; MapStruct 将生成一个内部方法,并且不会使用您定义的方法
    • 谢谢,现在我得到了所需的输出。
    猜你喜欢
    • 2021-06-10
    • 2018-09-15
    • 2023-03-29
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多