使用 MapStruct 的嵌套列表映射
Nested list mapping using MapStruct
如何在以下情况下使用 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(列表到列表)。
首先,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);
}
如何在以下情况下使用 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(列表到列表)。
首先,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);
}