2017-10-20 1490 views
0

如何在下面的場景中使用MapStruct進行bean映射。使用MapStruct進行嵌套列表映射

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(列表到列表)。

回答

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

感謝您的詳細解答。爲什麼課程是列表?這是要求。你也可以用映射類的正確源代碼更新答案。第一個toMembers()方法返回成員列表而不是Student列表。 –

+0

我不認爲我遵循。源代碼返回一個'List ' – Filip

+0

我得到編譯時錯誤與上面的代碼。 –